Frage

Per meinen anderen Beitrag über WCF-Dienst Rückgabewerte , ich bin von einem anderen Unternehmen einen Web-Service aufwendig, und wenn ich den Dienstverweis in Visual Studio hinzufügen, der Rückgabewert des Verfahrens ist ein Objekt vom Typ object.

Der Autor des Webdienstes zeigte mir den Code, und es gibt tatsächlich ein typisierte Objekt.

Bin ich etwas fehlt, oder ist die Proxy-Klasse soll einen typisierten Wert zurück?

Gibt es eine Einstellung, die Proxy-Klasse zur Erzeugung oder den eigentlichen Dienst?

UPDATE:

Ich schaute auf den tatsächlichen Klassen hinter dem WCF-Dienst und erkennen, dass der Rückgabewert der Service-Methode tatsächlich eine Schnittstelle zurückkehrt , dass die konkreten Typ implementiert. Der konkrete Typ wird mit dem markierten [Datacontract] Attribute (und entsprechenden [Datamember] Attributen), aber die Schnittstelle hat keine solche Eigenschaften. Könnte dies den Dienst verursacht sein, den Rückgabetyp als Objekt zu setzen?

War es hilfreich?

Lösung

Hypothetisch, wenn Sie die Service-Entwickler sind, könnten Sie eine KnownTypeAttribute verwenden:

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

Ich habe nicht persönlich versucht, dies mit einer Schnittstelle, aber ich habe es mit einer abstrakten Basisklasse versucht, und es funktioniert gut. Wenn der Kunde erhält den Rückgabewert, kann es zu der abgeleiteten Klasse erfolgreich niedergeschlagen.

Es könnte sein, dass der Service-Code dies tatsächlich der Fall ist, und das Problem liegt bei svcutil.exe die Proxy-Klassen genau genug, um nicht zu erzeugen.

Auch wenn Sie nicht über den Service-Code steuern, haben Sie den Client-Proxy-Code steuern. Sie könnten versuchen, die Proxy-Klassen manuell bearbeiten, die Sie svcutil.exe gab dem KnownTypeAttribute selbst hinzufügen. Auf diese Weise Sie die Kontrolle über das Verhalten des DataContractSerializer an Ihrem Ende nehmen, und solange Sie darauf achten, nicht den Draht Format der Daten versehentlich zu ändern, sollte es immer noch funktionieren.

Andere Tipps

Die Proxy-Klasse ist eine generierte Datei und als solche können sie Fehler enthalten. Wenn Sie eine Kopie des Datenvertrag haben Sie sind frei, die Proxy-Klasse zu ändern, den richtigen Typ zu verwenden, anstatt System.Object und Dinge sollten richtig arbeiten.

„Dienstverweis hinzufügen“

Die Visual Studio-Tool und svcutil.exe ist sehr gut im Proxy-Klassen zu erzeugen, aber sie sind nicht perfekt. Die Dateien, die sie erzeugen, sind Sie zu ändern und ich möchte Dich ermutigen, einfach den Betrieb zu modifizieren, um den richtigen Datenvertrag zurückzukehren.

Wir hatten ein ähnliches Problem, wenn ein Java-Web-Service von WCF raubend.

In unserem Fall des Typ, der es sagte, dass es zurückkehrt wurde eine eingeschränkte Version von dem, was tatsächlich zurückgegeben wurde.

Was für uns arbeitete, war das Objekt der Art zu werfen, die erwartet wurde. Danach wird die Daten zur Verfügung.

Deshalb, um Ihr Problem zu beheben könnten Sie versuchen, das Objekt in dem Typ umgewandelt erwartet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top