2010-09-29 98 views
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(並刪除abstractItem修改),異常消失,但由此產生的反序列化的對象顯然有點無用。

我錯過了什麼?

+0

我得到了一個像這樣的錯誤,但我的問題完全不同。我將WCF服務轉換爲ASMX服務。每個人對'__type'屬性使用不同的格式。更新'__type'使用ASMX的格式完全解決了我的問題。 – sparebytes 2012-07-25 20:22:10

回答

14

啊哈!點擊這個問題右側的相關鏈接,我發現an answer幫助我解決了這個問題。

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) { ... } 
} 

如果沒有這些屬性,解串器不知道我的派生類型。