6
我有一个ScriptService
幅方法(.NET 3.5)这需要一个抽象基类的一个参数:ASP.NET ScriptService反序列化问题与派生类型
[WebMethod(EnableSession=true)]
[ScriptMethod()]
public bool Test(Item item) { ... }
和:
namespace Namespace {
public abstract class Item
{
public int id;
}
public class Group : Item
{
public Item[] items;
}
public class Instance : Item
{
public string whatever;
}
}
通常,当调用该方法时,item
将是包含Instance
和/或Group
对象的Group
。我从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":[]}}
...我得到一个InvalidOperationException
:
{"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对象的__type
成员或将其更改为Namespace.Item
(并删除abstract
从Item
修改),异常消失,但由此产生的反序列化的对象显然有点无用。
我错过了什么?
我得到了一个像这样的错误,但我的问题完全不同。我将WCF服务转换为ASMX服务。每个人对'__type'属性使用不同的格式。更新'__type'使用ASMX的格式完全解决了我的问题。 – sparebytes 2012-07-25 20:22:10