7 Stimmen

Wie kann man WCF zwingen, xs:All anstelle von xs:Sequence zu verwenden, so dass die Reihenfolge der SOAP-Elemente irrelevant ist?

Wie kann man WCF dazu bringen, xs:All anstelle von xs:Sequence zu verwenden, wenn es komplexe Objekttypen in der wsdl/xsd für einen Webdienst definiert?

Das Problem, das ich habe, ist, dass xs:Sequence erfordert, dass aufrufende Anwendungen die Elemente in der Soap-Nachricht in der Reihenfolge übergeben, die in der WCF generiert xsd (dies ist alphabetisch standardmäßig). xs:All (oder Wahl für diese Angelegenheit) kümmert sich nicht um die Reihenfolge.

Kann dieses Verhalten einfach durch eine Konfigurationsoption irgendwo geändert werden?

3voto

Philippe Punkte 3817

Aus dem Stegreif denke ich, dass das nicht geht. Was Sie stattdessen tun können, ist, die WSDL-Datei von Hand zu schreiben und dann svcutil.exe zu verwenden, um den Code zu generieren.

Wenn Sie lediglich die Elemente in einer anderen als der alphabetischen Reihenfolge anordnen möchten, können Sie die Elemente im DataContract mit dem Parameter Order (beginnend bei 1, nicht 0 wie bei Arrays) des Attributs [DataMember] anordnen ([DataMember(Order = 1)], [DataMember(Order = 2)] usw.).

2voto

Eugene Osovetsky Punkte 6302

Sie können WCF so umstellen, dass der XmlSerializer anstelle des DataContractSerializer verwendet wird. Der XmlSerializer unterstützt xs:all. Siehe http://msdn.microsoft.com/en-us/library/ms733901.aspx

0voto

Abacus Punkte 1905

Selbst wenn Sie WCF dazu zwingen könnten, würde der Deserialisierer nicht korrekt funktionieren, um die Eingabe zu unterstützen. Beispiele und Erklärung unten.

Eingang 1 (gut):

<MyOperation>
  <AField>value A</AField>
  <BField>value B</BField>
</MyOperation>

Eingang 2 (schlecht):

<MyOperation>
  <BField>value B</BField>
  <AField>value A</AField>
</MyOperation>

Wenn also Eingabe 1 korrekt deserialisiert wurde, dann würde Eingabe 2 nicht - BField würde einen Wert haben, der festgelegt wurde, aber die Eigenschaft AField wäre null.

Wenn WCF diese Out-of-Sequence-Eingabe nicht verarbeiten kann, denke ich stark, dass es eine Ausnahme auslösen sollte, aber auf der Grundlage meiner Tests (.NET 3.5 in IIS) tut es nicht so, es überspringt nur einige Elementwerte.

Darüber hinaus ignoriert WCF auch völlig falsche Eingaben, solange sie sich nicht auf die gültigen Elementwerte auswirken, nach denen es sucht. Also diese Eingabe

<MyOperation>
  <bogusField>with or without data</bogusField>
  <AField>value A</AField>
  <bogusField2 />
  <BField>value B</BField>
  <bogusField3></bogusField3>
</MyOperation>

würde keine Fehler auslösen und würde tatsächlich die Werte in AField und BField deserialisieren.

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