WCF-Client-Probleme erkennen ServiceKnownTypes?
Wie würde ich sagen, dass der WCF-Dienst, was KnownTypes zu verwenden, wenn die Weitergabe der Daten an den client zurück?
Ich weiß, ich kann die [ServiceKnownType]
- Attribut, das macht den service gut laufen, die von einem WCF Test-Server, aber es immer noch nicht aus dem client. Bin ich hier etwas fehlt?
[OperationContract]
[ServiceKnownType(typeof(SubClassA))]
[ServiceKnownType(typeof(SubClassB))]
BaseClassZ GetObject();
Fehlermeldung vom client:
{"Element
'http://schemas.datacontract.org/2004/07/BaseClassZ'
die Daten enthält, von einem Typ zuordnet
der name
'http://schemas.datacontract.org/2004/07/SubClassA'.
Der deserializer hat keine Kenntnis von
jede Art, die Karten zu diesem Namen.
Erwägen Sie die Verwendung einer DataContractResolver
oder fügen Sie dem Typ entsprechend
'SubClassA" in die Liste der bekannten Typen
- zum Beispiel, indem die KnownTypeAttribute-Attribut oder durch
hinzufügen zu der Liste der bekannten Typen
übergeben DataContractSerializer."}
Serialisieren/Deserialisieren das Objekt auf der WCF-server mit einem DataContractSerializer und eine Liste der KnownTypes funktioniert einwandfrei.
UPDATE: Es scheint, ich kann den client zum Lesen der Objekt richtig wenn ich KnownType-Attribute der Basisklasse, aber ich bin noch auf der Suche nach einem Weg, um dieses, wenn möglich, da die Basis-Klasse wird verwendet, für eine Menge von Elementen und das möchte ich nicht ändern, das KnownType-Attribute in der base-Klasse, immer wenn ich ein neues Element hinzufügen.
[DataContract]
[KnownType(typeof(SubClassA))]
[KnownType(typeof(SubClassB))]
public class BaseClassZ
{
...
}
InformationsquelleAutor Rachel | 2010-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Vermeidung der Abschreckung von Ihrem service-code, der die bekannten Typen in web.config des service:
Wenn Sie wollen, es zu tun, indem Sie code, den Sie benötigen, um dieses Attribut auf die service-Schnittstelle und nicht auf die operation-Methode, aber ich würde es vorziehen, den deklarativen Ansatz:
UPDATE:
Habe ich eine Beispiel-Projekt, welche die Verwendung der web.config zum konfigurieren der bekannten Typen, das ist mein bevorzugter Ansatz. Und ein weiterer Beispiel-Projekt demonstriert der zweite Ansatz.
UPDATE 2:
Nach einem Blick auf die aktualisierte code mit dem Silverlight-client-Anwendung bemerken wir die folgende definition:
Beachten Sie, wie die
BeginGetSingle
- Methode enthält den bekannten type-Attribute während derBeginGetMany
Methode nicht. In der Tat werden diese Attribute sollten sein gelegt auf die service-definition, so dass die Klasse sieht wie folgt aus.Dies ist eine automatisch generierte Klasse, es könnte ein bug in der SLsvcUtil.exe und
svcutil.exe
, da es zeigt das gleiche Verhalten. Setzen die bekannten type-Attribute auf Ihrer richtigen Stelle löst das problem. Das problem ist, dass diese Klasse ist eine automatisch generierte durch ein Werkzeug, und wenn Sie versuchen, sich zu regenerieren es von der WSDL wird es mess up wieder.So scheint es, dass, wenn Sie die folgende service-definition:
Und die 3 Daten-Verträge, die hier geteilt werden zwischen dem client und dem server beim importieren der definition des Dienstes, die Methode gibt eine collection zurück, erhalten nicht die richtigen bekannten type-Attribute in den generierten client-proxy. Vielleicht ist das by design.
Nein ist es nicht. Sie können die Kasse der Beispiel-Projekt ich habe in Ort, um es zu illustrieren.
Ich Wette, das hat etwas mit der Tatsache zu tun, dass ich die Wiederverwendung von Typen aus einer gemeinsamen Versammlung.
hier ist ein Beispiel mit shared assembly. Beachten Sie, wie bekannte Arten konfiguriert sind in app.config auf der client.
Sollte ich das geklärt haben. Ich versuche, um wieder eine Sammlung von Objekten (IEnumerable<BaseClass>). Die base-Klasse und die davon abgeleiteten Typen existieren in einer eigenen assembly verwiesen wird, sowohl dem client und dem server. Wenn ich den client-proxy verwendet es, die vorhandenen Typ, aber kann nicht deserialisiert werden die Ergebnisse in den abgeleiteten Klassen. (vielleicht sollte ich den spawn aus eine ganz neue Frage, da wird es etwas komplizierter auf warum mache ich das?)
InformationsquelleAutor Darin Dimitrov
Ich verbrachte Stunden heute an, was, wie am besten ich sagen kann, ist genau das gleiche Problem. Die Lösung für mich war, mit AddGenericResolver Methode von IDesign ist ServiceModelEx Bibliothek.
HINWEIS: .NET 4.0 erforderlich, da es verwendet DataContractResolver
Finden Sie es auf IDesign-Downloads-Seite.
Alles hatte ich zu tun in meinem Fall war fügen Sie die folgende Zeile des Codes:
Ich hoffe, dies hilft jemand anderes da draußen außer ein paar Stunden!
Weitere Informationen finden Sie in dem Buch "Programming WCF Services: Mastering WCF und Azure AppFabric Service Bus" von Juval LÖWY
InformationsquelleAutor Hastarin
Es ist ein weiterer Weg, dies zu tun. Anstatt mit "add service reference" geben Sie den code der proxy-Klassen. Es ist etwas mehr Codierung zunächst aber gibt Ihnen viel mehr stabile und robuste Lösung. Wir haben festgestellt, dass das spart uns Zeit in der langen run.
Finden Sie unter: http://www.dnrtv.com/default.aspx?showNum=122
Hinweis: dies funktioniert nur, wenn Sie die Kontrolle über den server und den client.
InformationsquelleAutor Shiraz Bhaiji