views:

159

answers:

1

I have an ASP.NET 3.5 SP1 web application that uses a custom JavaScriptConverter. The code used to work at some time in the past, but has stopped working. I do not know what changes have happened in the middle server side. The problem we are seeing now is that the converter is not being invoked, so we are getting errors that System.Data.DataRow cannot be serialized.

The following is the relevant portion of web.config:

<system.web.extensions>
 <scripting>
  <webServices>
   <jsonSerialization>
    <converters>
     <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview" />
    <add name="DataRowConverter" type="WebUI.DataRowConverter, WebUI.DataRowConverter, Version=1.1.0.323, Culture=neutral" />
     <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview" />
    </converters>
   </jsonSerialization>
  </webServices>
 </scripting>
</system.web.extensions>

A trimmed version of the class is as follows (trimmed only to avoid wasting space on unnecesary implementation):

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Web.Script.Serialization;

namespace WebUI {
    public class DataRowConverter : JavaScriptConverter {
        private ReadOnlyCollection<Type> _supportedTypes = new ReadOnlyCollection<Type>(new Type[] { typeof(DataRow) });

        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) {
            // stuff
            return dr;
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) {
            // stuff
            return dictionary;
        }

        public override IEnumerable<Type> SupportedTypes {
            get {
                return this._supportedTypes;
            }
        }
    }
}

What seems to happen is that the class is indeed being loaded (if we take it out of web.config and the project references, no breakpoints are available; put it back into web.config and copy the DLL/PDB by hand or add it to the project, breakpoints are available), but it's not being used propertly. No breakpoint anywhere in the class is hit, and no exceptions (including one thrown in a constructor added to see what happens) are thrown. It seems like the class is being loaded but never called.

This is on IIS 7.5 and IIS 7.0 in Integrated mode, if it matters.

Anyone have any ideas?

A: 

OK, just in case anyone else hits this, when calling web services through the automatically generated test pages, the custom serializers are not invoked - they are bypassed. This is apparently by design.

MikeBaz
@MikeBaz - you should mark your answer accepted. It is correct.
Sky Sanders

related questions