ASP.NET ScriptService-Deserialisierungsproblem mit abgeleiteten Typen

Ich habe einScriptService web-Methode (.NET 3.5), die einen einzelnen Parameter eines abstrakten Basistyps verwendet:

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

Und

namespace Namespace {
public abstract class Item
{
    public int id;
}

public class Group : Item
{
    public Item[] items;
}

public class Instance : Item
{
    public string whatever;
}
}

Normalerweise, wenn die Methode aufgerufen wird,item wird ein ... seinGroup was beinhaltetInstance und / oderGroup Objekte. Ich rufe diesen Service von jQuery aus an. Ich verwende nicht das clientseitige Microsoft-Framework. Aufrufe anderer Methoden funktionieren einwandfrei.

Das Problem Wenn ich aufrufe, wird eine Ausnahme ausgelöst, bevor meine Methode überhaupt aufgerufen wird. Zum Beispiel, wenn mein Anruf lautet:

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":[]}}

... ich bekomme einInvalidOperationException:

{"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"}

Wenn ich das @ fallen las__type Mitglied des JSON-Objekts oder ändern Sie es inNamespace.Item (und entferne dasabstract Modifikator vonItem), die Ausnahme verschwindet, aber das resultierende deserialisierte Objekt ist offensichtlich irgendwie nutzlos.

Was vermisse ich

Antworten auf die Frage(4)

Ihre Antwort auf die Frage