C# 派生类型的ASP.NET ScriptService反序列化问题

C# 派生类型的ASP.NET ScriptService反序列化问题,c#,javascript,ajax,json,scriptservice,C#,Javascript,Ajax,Json,Scriptservice,我有一个ScriptServiceweb方法(.NET 3.5),它接受一个抽象基类型的参数: [WebMethod(EnableSession=true)] [ScriptMethod()] public bool Test(Item item) { ... } 以及: 通常,当调用该方法时,项将是一个组,其中包含实例和/或组对象。我从jQuery调用此服务;我没有使用Microsoft客户端框架。对其他方法的调用工作正常 问题:当我进行调用时,在调用我的方法之前会引发异常。例如,如果我的电

我有一个
ScriptService
web方法(.NET 3.5),它接受一个抽象基类型的参数:

[WebMethod(EnableSession=true)]
[ScriptMethod()]
public bool Test(Item item) { ... }
以及:

通常,当调用该方法时,
将是一个
,其中包含
实例
和/或
对象。我从jQuery调用此服务;我没有使用Microsoft客户端框架。对其他方法的调用工作正常

问题:当我进行调用时,在调用我的方法之前会引发异常。例如,如果我的电话是:

POST /WebService.asmx/Test HTTP/1.1
Content-Type: application/json; charset=UTF-8
Accept: application/json, text/javascript, */*

{"item":{"id":0,"__type":"Namespace.Group","items":[]}}
…我收到一个
无效操作异常

{"Message":"Operation is not valid due to the current state of the object.","StackTrace":"   at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}
如果我删除JSON对象的
\uu type
成员,或者将其更改为
Namespace.Item
(并从
Item
中删除
abstract
修饰符),异常会消失,但得到的反序列化对象显然是无用的


我错过了什么?

啊哈!点击这个问题右侧的相关链接,我发现它帮助我解决了这个问题

GenerateScriptType
属性必须应用于web服务类:

[WebService( ... )]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[GenerateScriptType(typeof(Group))]
[GenerateScriptType(typeof(Instance))]
public class WebService : System.Web.Services.WebService
{
    [WebMethod(EnableSession=true)]
    [ScriptMethod()]
    public bool Test(Item item) { ... }
}

如果没有这些属性,反序列化程序就不知道我的派生类型。

我可以使用
Newtonsofts JsonConvert
解决这个问题,如下所示

[System.Web.Services.WebMethod]      
public static void MyAjaxCallingMethod(object inputs)
    {           
    string stingDataFromAjaxCall = JsonConvert.SerializeObject(inputs);
            MyObject myObj = JsonConvert.DeserializeObject<MyObject>(stingDataFromAjaxCall);
            ....}
[System.Web.Services.WebMethod]
公共静态void MyAjaxCallingMethod(对象输入)
{           
字符串stingDataFromAjaxCall=JsonConvert.SerializeObject(输入);
MyObject myObj=JsonConvert.DeserializeObject(stingDataFromAjaxCall);
....}

我遇到了这样的错误,但我的问题完全不同。我将WCF服务转换为ASMX服务。每个属性都使用不同的
\u类型
属性格式。更新
\uu type
以使用ASMX的格式完全解决了我的问题。
[System.Web.Services.WebMethod]      
public static void MyAjaxCallingMethod(object inputs)
    {           
    string stingDataFromAjaxCall = JsonConvert.SerializeObject(inputs);
            MyObject myObj = JsonConvert.DeserializeObject<MyObject>(stingDataFromAjaxCall);
            ....}