6 Stimmen

svcutil lässt das Attribut ServiceKnownType aus dem generierten Schnittstellen-Proxy weg

Ich bin auf ein Problem gestoßen, als ich versucht habe, das ServiceKnownType-Beispiel aus MSDN zu implementieren. In dem Beispiel werden die folgenden Klassen bereitgestellt:

[DataContract()]
public class Widget
{
    [DataMember]
    public string Id;
    [DataMember]
    public string Catalog;
}

[DataContract()]
public class Machine : Widget
{
    [DataMember]
    public string Maker;
}

Und die folgende Schnittstelle:

[ServiceKnownType(typeof(Widget))]
[ServiceKnownType(typeof(Machine))]
[ServiceContract()]
public interface ICatalog
{
    [OperationContract]
    Hashtable GetItems();
}

Das Problem ist, dass bei der Generierung der Proxy-Klasse (mit "Add Service Reference" / svcutil.exe) die "ServiceKnownType"-Attribute von der ICatalog-Proxy-Schnittstelle weggelassen werden, was zu einer Ausnahme führt "Der Formatierer hat beim Versuch, die Nachricht zu deserialisieren, eine Ausnahme ausgelöst: Fügen Sie den Typ, der 'Widget' entspricht, zur Liste der bekannten Typen hinzu" Um dieses Problem zu lösen, muss ich die bekannten Attribute des Dienstes manuell zur generierten Proxy-Schnittstelle hinzufügen, was eine sehr schlechte Lösung ist, da der Code neu generiert wird, wenn ich die Referenz aktualisiere. Das Interessante an dieser Situation ist, dass das Problem gelöst wäre, wenn die GetItems-Operation ein Objekt anstelle einer Hashtabelle zurückgeben oder ein Objekt als Parameter erhalten würde, d. h.

[OperationContract]
object GetItems();

ou

[OperationContract]
Hashtable GetItems(object obj);

führt zum Vorhandensein des Attributs "ServiceKnownType" auf der ICatalog-Proxy-Schnittstelle. Weiß jemand, wie man dieses Problem lösen kann?

Gracias

1voto

Hastarin Punkte 303

Ich verbrachte Stunden heute auf, was, so gut ich kann sagen, ist genau das gleiche Problem. Die Lösung für mich war, die AddGenericResolver-Methode aus der ServiceModelEx-Bibliothek von IDesign zu verwenden.

HINWEIS: .NET 4.0 erforderlich, da es die DataContractResolver

Sie finden es unter IDesign Downloads Seite .

In meinem Fall musste ich lediglich die folgende Codezeile hinzufügen:

Client.AddGenericResolver( typeof ( K2Source ) );

Ich hoffe, dass dies jemandem da draußen hilft, ein paar Stunden zu sparen!

Weitere Informationen finden Sie in dem Buch "Programming WCF Services: Mastering WCF and the Azure AppFabric Service Bus" von Juval Lowy

0voto

Dmitry Ornatsky Punkte 2187

Scheint ein Zusammenhang zu sein Problem .

Haben Sie versucht, das generische Wörterbuch der Widgets zurückzugeben und [KnownType(typeof(Machine))] auf die Widget-Klasse?

3 Stimmen

Ich möchte, dass es mit ServiceKnownType und nicht mit KnownType funktioniert, da ich in meinem realen Szenario kein Attribut für die Klasse "Widget" hinzufügen kann, da es sich in einer DLL befindet, die ich nicht ändern kann. Ich würde jede andere Lösung für mein Szenario schätzen, aber ich möchte auch wissen, warum das MSDN-Beispiel nicht funktioniert

0voto

Vita Punkte 61

Das Problem mit dem ignorierten ServiceKnownType von svcutil ist immer noch da. Meine Lösung ist "bekannte Typen" zu Client-Vertrag Referenz programmatisch hinzufügen:

var client = new ServiceReferenceClient("clientEndpoint");
foreach (var o in client.Endpoint.Contract.Operations)
{
   o.KnownTypes.Add(typeof(MyType01));
   o.KnownTypes.Add(typeof(MyType02));
   o.KnownTypes.Add(typeof(MyType03));
}

Es ist keine perfekte Lösung (muss auf der Client-Seite hart kodiert werden), aber es funktioniert bei mir.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X