2009-08-18 10 views
6

Ich habe ein Objekt, das eine generische IList darin hat, die von einem WCF-Web-Service-Methode zurückgegeben wird:WCF IList Serialisierung Ausgabe

[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> 
{ 
    [DataMember] 
    public IList<T> Items { get; set; } 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

[OperationContract] 
PageableResults<ContentItem> ListCI(); 

Wenn ich diese Methode aufrufen, auf den Dienst führt er das gesamte Verfahren fein , aber am Ende wird eine System.ExecutionEngineException ohne eine InnerException ausgelöst. Ich habe versucht, eine konkrete List <> -Objekt zurückgeben, und das scheint zu funktionieren, aber leider muss ich eine Problemumgehung finden, um eine IList zurückzugeben. Gibt es irgendwelche Attribute, die ich einsetzen muss, um das zu lösen?

+0

Sie sagen "Wenn ich diese Methode auf den Dienst aufrufen" - Ist der Fehler tatsächlich beim Deserialisieren des Ergebnisses? –

+0

Ich denke, es passiert in der Service-Seite, wenn es das Objekt serialisiert, da es rechts wirft, wenn ich die Service-Methode verlasse, aber es gibt keine Stack-Verfolgung in der Ausnahme, so dass ich nicht positiv sein kann. – Nick

Antwort

1

Sie werden hinzufügen müssen KnownTypes für jede Nutzung von T. Wie dies über Ihre Klassendefinition auf der Klassendefinition Attribut:


[KnownType(typeof(ContentItem))] 
[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> 
{ 
    [DataMember] 
    public IList<T> Items { get; set; } 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

[OperationContract] 
PageableResults ListCI(); 

Alternativ können Sie Ihre eigene Sammlung Klasse definieren, die eine totalRows Eigenschaft hat , wie folgt aus:


[KnownType(typeof(ContentItem))] 
[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> : EntityCollectionWorkaround<T> 
{ 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

Wo EntityCollectionWorkaround hier definiert:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

1

Ich glaube nicht, dass Sie das tun können. Wie wird der Serialisierer wissen, was zu desetarialisieren ist? Viele Dinge könnten eine IList implementieren, und eine Schnittstelle hat keinen Konstruktor.

+0

Es scheint gut zu funktionieren, wenn Sie netTcpBinding verwenden, aber nicht mit WSHttpBinding – Nick

+0

was ist der zugrunde liegende Typ, zu dem es deserializing ist? Ich sehe nicht, wie das funktionieren könnte, es sei denn, es würde nur zufällig einen Container auswählen, der IList implementiert und sie dort anbringt. – Steve

0

Vererben Sie von PageableResults, um eine geschlossene generische Unterklasse, in Ihrem Fall PageableContentItem oder etwas Ähnliches, zu erstellen und diese als Rückgabetyp zu verwenden. Bei Webservices wird normalerweise der XML-Serializer verwendet und er muss alles im Voraus wissen, deshalb können Sie auch keine Interfacetypen zurückgeben.

Verwandte Themen