Warum wird das XmlRoot-Attribut in WCF ignoriert und wie wird dies behoben?

8

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 -

  1. Jeder weiß, was das Grundprinzip ist hinter dieser Entscheidung?
  2. Jeder weiß es Wie läuft das ab? Ich war unter die Eindrücke, die WCF, mit der XmlSerializerFormat Attribut, verwendet der XmlSerialiser zum Serialisieren der Typen, die XmlRoot vorschlagen würden sollte berücksichtigt werden, wie Kommt das nicht vor? (ist es nur aufgrund der Tatsache, dass der SOAP - Umschlag, der Parameter ist nicht root?)
  3. Am meisten Wichtig - jeder weiß ob Es gibt eine Möglichkeit, das Problem zu erzwingen - d. h., die Parameter müssen die sein Namensraum unserer Wahl?

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%     
Yossi Dahan 06.01.2010, 14:50
quelle

2 Antworten

2

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%     
Josh 16.01.2010, 09:08
quelle
1

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.

  1. 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 .

  2. 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:

  • urn: Der-Service-Namespace
    verwendet für das Element, das die Anfrage und die Antwort umschließt - das erste Element in der & lt; SOAP: body & gt;
  • urn: Der-Anfrage-Namespace
    Wird für das Element verwendet, das innerhalb dieses Anforderungswrappers eingeschlossen ist, der in eine Instanz von Type1 deserialisiert wird.
  • urn: The-Response-Namespace
    Wird für das Element verwendet, das innerhalb dieses Antwort-Wrappers eingeschlossen ist, der in eine Instanz von Type2 deserialisiert wird.

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.

    
Cheeso 15.01.2010 04:14
quelle

Tags und Links