Wir haben eine bestehende SOAP-Webservice-Schnittstelle, die wir mit WCF für eine neue Anwendung implementieren möchten. Dies scheint gut zu funktionieren, bis auf ein kleines Detail. Der XML-Namespace des Rückgabetyps einer Funktion muss sich vom XML-Namespace des Webdiensts selbst unterscheiden. Und für das Leben von mir kann ich es nicht zur Arbeit bringen.
Ich habe das gleiche Problem mit einem kleinen Beispielprojekt neu erstellt. Die WCF-Schnittstelle:
%Vor%Die Web-Service-Implementierung:
%Vor%Eine Antwort von diesem Webservice wird dann serialisiert als: (SOAP-Zeug auslassen)
%Vor%Aber wir wollen das & lt; DoStuffResult & gt; von xmlns="urn: inner-namespace" sein.
Ich habe versucht, ein [return: XmlElement (...)] für die Interface-Funktion oder die Web-Service-Funktion hinzuzufügen, aber das dauert nicht. Auch ein [XmlType] oder [XmlRoot] für die MyClass-Klassendefinition funktioniert nicht.
Hat jemand eine Idee, wie der serialisierte XML-Namespace (oder Elementname) des Objekts geändert werden kann, der der Rückgabewert einer WCF-Webservice-Funktion ist?
Definieren Sie Namespaces mit den XML-Serialisierungsattributen (oder besser) Data Contract-Attributen.
z.B. mit XML-Serialisierung:
%Vor%z.B. mit der Serialisierung von Datenverträgen:
%Vor%BEARBEITEN
Auf Grundlage des ersten Kommentars funktioniert das obige nicht, da der Namespace auf dem SOAP-Wrapper um die Nachricht und nicht auf der Nachricht selbst festgelegt werden soll.
OperationContractAttribute
bietet keine Kontrolle über Namespaces und ich kann keine anderen WCF-Attribute auf Methodenebene sehen.
Zwei Möglichkeiten: (1) Sie haben möglicherweise genug Kontrolle, indem Sie ein Abstraktionsniveau fallen lassen und einen Nachrichtenvertrag verwenden. (2) Holen Sie sich die aktuelle WSDL für den Service (mit svcutil.exe
), passen Sie sie manuell an, um die gewünschten Namespaces zu erhalten, und verwenden Sie dann erneut svcutil.exe
, um den Code zu generieren und den resultierenden Code zu sehen.
Nach Tagen des Suchens und Ausprobierens von Dutzenden von empfohlenen Lösungen; Endlich konnte ich erreichen, dass WCF nicht mehr den Namen des Wrappercontainers mit anhängendem Result
auf den Namen der Web-Service-Methode erzwang. Der Trick bestand darin, der Web-Service-Schnittstelle das folgende Decorator-Attribut hinzuzufügen:
Dieses Attribut sollte direkt nach dem [OperationContract]
-Attribut (und direkt vor dem eigentlichen Methoden-Stub) in der Schnittstelle platziert werden.
(Ich musste außerdem ein Attribut XmlSerializerFormat
zu allen Attributen ServiceContract
und OperationContract
hinzufügen.)
Tags und Links wcf c# xml serialization xml-serialization