Wir haben beobachtet, dass bei der Bereitstellung eines WCF-Dienstes, der mit verschiedenen XML-Serialisierungsattributen versehene Klassen verwendet, trotz der Tatsache, dass das XmlSerializerFormat-Attribut für die Schnittstelle verwendet wird, jedes XmlRoot-Attribut für alle Parameter der Operation vollständig ignoriert wird. Der Namespace der Parameter ist immer der des Services und nicht das, was wir angeben.
Dies verursacht uns Probleme, da es nicht rückwärtskompatibel zu ASMX zu sein scheint und auch weil wir BizTalk verwenden und eine strengere Kontrolle über die Form der ausgetauschten XML-Dateien haben müssen.
Ein paar Fragen dann -
Ich habe diesen Beitrag gesehen, aber ich glaube nicht, dass es für meine Frage relevant ist -
Wie von Wagner Silveira gefordert, sind die Verträge, die ich getestet habe, -
%Vor%Ich nehme an, dass Sie SOAP als Nachrichtenformat verwenden. In diesem Fall ist das Objekt, das Sie serialisieren, nicht die Wurzel des XML, der Soap Envelope. Es macht also Sinn, dass der XmlRoot ignoriert wird. Standardmäßig erstellt WCF einen Nachrichtenvertrag für Sie und benennt die Antwort und hat den Namespace des Dienstes. Was Sie tun können, ist Erstellen Sie Ihren eigenen Nachrichtenvertrag , um die volle Kontrolle über SOAP zu haben.
>Erstellen Sie die folgenden zwei Klassen:
%Vor%Ändern Sie dann die Signatur Ihrer Serviceoperation in die folgenden.
%Vor%Wenn Sie nun die SOAP-Nachrichten als Beispiel verwenden, sollten Sie Folgendes sehen:
Anfrage
%Vor%Antwort
%Vor%Ich weiß nicht, warum WCF XmlRoot ignoriert, daher kann ich diesen Teil Ihrer Frage nicht beantworten. Aber ich habe ein paar Wege, um das Problem zu lösen.
Beginnen Sie zuerst mit WSDL.
Wenn Sie bestimmte XML-Namespaces verwenden, die Sie auf die gesendeten und empfangenen Nachrichten anwenden möchten, verwenden Sie WSDL und XML-Schema, um sie explizit anzugeben.
Generieren Sie dann den serverseitigen Stubcode oder den clientseitigen Proxycode direkt aus dieser WSDL über Das Tool svcutil.exe .
verwenden ein benutzerdefinierter ServiceHost
Die andere Option, die für Sie geöffnet ist, wird unter beschrieben link , verwenden Sie einen benutzerdefinierten ServiceHost, der die Entscheidung von WCF außer Kraft setzt, die XmlRoot- oder XmlType-Attribute für Nachrichtentypen außer Acht zu lassen.
Wenn Sie sich für den WSDL-First-Ansatz entscheiden, sollte die WSDL wie folgt aussehen:
%Vor%Diese WSDL ist sehr einfach - sie definiert eine einzelne Operation mit einer einzelnen Anforderungsnachricht und einer einzelnen Antwortnachricht.
Beachten Sie, dass drei XML-Namespaces vorhanden sind:
Wenn Ihre Web-Service-Schnittstelle komplizierter ist, mehr Operationen und folglich mehr Anfrage- und Antwort-Nachrichtentypen aufweist, können Sie bei Bedarf für all diese zusätzlichen Typen weitere Namespaces hinzufügen.
Tags und Links wcf xml-serialization