Messagingprotokolle
Der WCF-Kanalstapel (Windows Communication Foundation) verwendet Codierungs- und Transportkanäle, um eine interne Nachrichtendarstellung in das Übertragungsformat zu transformieren und mithilfe einer bestimmten Transportmethode zu senden. Der am häufigsten verwendete Transport, der für die Interoperabilität bei Webdiensten verwendet wird, ist HTTP, und die am häufigsten von Webdiensten verwendeten Codierungen sind das XML-basierte SOAP 1.1, SOAP 1.2 und der Message Transmission Optimization Mechanism (MTOM).
Dieser Artikel enthält WCF-Implementierungsdetails für die folgenden Protokolle, die von HttpTransportBindingElement verwendet werden.
Spezifikation/Dokument:
- HTTP 1.1
- SOAP 1.1-HTTP-Bindung, Abschnitt 7
- SOAP 1.2-HTTP-Binding, Abschnitt 7
Dieser Artikel enthält WCF-Implementierungsdetails für die folgenden Protokolle, die von TextMessageEncodingBindingElement und MtomMessageEncodingBindingElement verwendet werden.
Spezifikation/Dokument:
- XML
- SOAP 1,1
- SOAP 1.2 Core
- WS-Adressierung 2004/08
- W3C Web Services Addressing 1.0 - Core
- W3C Web Services Addressing 1.0 - SOAP-Bindung
- W3C Web Services Addressing 1.0 – WSDL-Binding
- W3C Web Services Addressing 1.0 - Metadaten
- WSDL SOAP1.1-Bindung
- WSDL SOAP1.2-Bindung
Dieser Artikel enthält WCF-Implementierungsdetails für die folgenden Protokolle, die von MtomMessageEncodingBindingElement verwendet werden.
Spezifikation/Dokument:
Die folgenden XML-Namespaces und zugeordneten Präfixe werden überall in diesem Artikel verwendet:
Präfix | Namespace Uniform Resource Identifier (URI) |
---|---|
s11 | http://schemas.xmlsoap.org/soap/envelope |
s12 | http://www.w3.org/2003/05/soap-envelope |
wsa | http://www.w3.org/2004/08/addressing |
wsam | http://www.w3.org/2007/05/addressing/metadata |
wsap | http://schemas.xmlsoap.org/ws/2004/09/policy/addressing |
wsa10 | http://www.w3.org/2005/08/addressing |
wsaw10 | http://www.w3.org/2006/05/addressing/wsdl |
xop | http://www.w3.org/2004/08/xop/include |
xmime | http://www.w3.org/2004/06/xmlmime http://www.w3.org/2005/05/xmlmime |
dp | http://schemas.microsoft.com/net/2006/06/duplex |
SOAP 1.1 und SOAP 1.2
Umschlag und Verarbeitungsmodell
Die WCF implementiert die SOAP 1.1-Umschlagsverarbeitung unter Befolgung von Basic Profile 1.1 (BP11) und Basic Profile 1.0 (SSBP10). SOAP 1.2-Umschlagsverarbeitung wird unter Befolgung von SOAP12-Part1 implementiert.
In diesem Abschnitt werden bestimmte, in Hinsicht auf BP11 und SOAP12-Part1 getroffene Implementierungsentscheidungen der WCF erläutert.
Erforderliche Headerverarbeitung
Die WCF befolgt bei der Headerverarbeitung die als mustUnderstand
gekennzeichneten und in den Spezifikationen für SOAP 1.1 und SOAP 1.2 beschriebene Regeln mit den folgenden Variationen.
Eine Nachricht, die in den WCF-Kanalstapel übergeht, wird von einzelnen Kanälen verarbeitet, die durch zugeordnete Bindungselemente konfiguriert werden (z. B. Textnachrichtencodierung, Sicherheit, zuverlässiges Messaging und Transaktionen). Jeder Kanal erkennt Header des zugeordneten Namespace, und kennzeichnet sie als verstanden. Sobald eine Nachricht in den Verteiler eingeht, liest der Vorgangsformatierer Header, die vom entsprechenden Nachrichten-/Vorgangsvertrag erwartet werden, und kennzeichnet sie als verstanden. Der Verteiler überprüft, ob einige der verbleibenden Header nicht verstanden, aber als mustUnderstand
gekennzeichnet sind, und löst eine Ausnahme aus. Nachrichten, die an den Empfänger gerichtete mustUnderstand
-Header enthalten, werden nicht vom Empfängeranwendungscode verarbeitet.
Eine derartige schichtweise Verarbeitung lässt eine Trennung zwischen den Infrastrukturschichten und Anwendungsschichten auf dem SOAP-Knoten zu:
B1111: Header, die nicht verstanden werden, werden nach der Verarbeitung der Nachricht durch den WCF-Infrastrukturkanalstapel, aber vor der Verarbeitung durch die Anwendung erkannt.
Der
mustUnderstand
Headerwert variiert zwischen SOAP 1.1 und SOAP 1.2. Basic Profile 1.1 erfordert, dass dermustUnderstand
-Wert für SOAP 1.1-Nachrichten "0" (null) oder "1" sein muss. SOAP 1.2 lässt 0 (null), 1false
undtrue
als Werte zu, empfiehlt aber die Ausgabe einer standardisierten Darstellung derxs:boolean
-Werte (false
,true
).B1112: Die WCF gibt die
mustUnderstand
-Werte 0 und 1 sowohl für die SOAP 1.1- als auch für die SOAP 1.2-Version des SOAP-Umschlags aus. Die WCF akzeptiert den gesamten Wertebereich vonxs:boolean
für denmustUnderstand
-Header (0, 1,false
,true
).
SOAP-Fehler
Die folgende Liste enthält WCF-spezifische SOAP-Fehlerimplementierungen.
B2121: Die WCF gibt die folgenden SOAP 1.1-Fehlercodes zurück:
s11:mustUnderstand
,s11:Client
unds11:Server
.B2122: Die WCF gibt die folgenden SOAP 1.2-Fehlercodes zurück:
s12:MustUnderstand
,s12:Sender
unds12:Receiver
.
HTTP-Bindung
SOAP 1.1 HTTP-Bindung
Die WCF implementiert die SOAP 1.1-HTTP-Bindung gemäß Abschnitt 3.4 der Basic Profile 1.1-Spezifikation mit den folgenden Erklärungen:
B2211: Der WCF-Dienst implementiert keine Umleitung von HTTP-POST-Anforderungen.
B2212: WCF-Clients unterstützen HTTP-Cookies in Übereinstimmung mit 3.4.8.
SOAP 1,2 HTTP-Bindung
Die WCF implementiert die SOAP 1.2-HTTP-Bindung gemäß der Beschreibung im zweiten Teil der SOAP 1.2-Spezifikation (SOAP12Part2) mit den folgenden Erklärungen.
SOAP 1.2 hat einen optionalen Aktionsparameter für den application/soap+xml
-Medientyp eingeführt. Dieser Parameter ist nützlich bei der Optimierung des Sendens von Nachrichten, ohne dass der Text der SOAP-Nachricht analysiert werden muss, wenn die WS-Adressierung nicht verwendet wird.
R2221: Der
application/soap+xml
-Aktionsparameter muss, wenn er in einer SOAP 1.2-Anforderung vorliegt, dem AttributsoapAction
auf dem Elementwsoap12:operation
in der dazugehörigen WSDL-Bindung entsprechen.R2222: Der
application/soap+xml
-Anwendungsparameter muss, wenn er in einer SOAP 1.2-Nachricht vorliegt,wsa:Action
entsprechen, wenn die WS-Adressierung 2004/08 oder die WS-Adressierung 1.0 verwendet wird.
Wenn die WS-Adressierung deaktiviert ist und eine eingehende Anforderung keinen Aktionsparameter enthält, gilt die Nachrichten-Action
als nicht angegeben.
WS-Adressierung
Die WCF implementiert drei WS-Addressing-Versionen:
WS-Adressierung 2004/08
W3C Web Services Addressing 1.0 Core (ADDR10-CORE) und SOAP-Bindung (ADDR10-SOAP)
WS-Addressing 1.0 - Metadata
Endpunktverweise
Alle WS-Addressing-Versionen, die von der WCF implementiert werden, verwenden Endpunktverweise zur Beschreibung von Endpunkten.
Endpunktverweise und WS-Adressierungsversionen
Die WCF implementiert eine Reihe von Infrastrukturprotokollen, die WS-Addressing und insbesondere das EndpointReference
-Element und die W3C.WsAddressing.EndpointReferenceType
-Klasse verwenden (z. B. WS-ReliableMessaging, WS-SecureConversation und WS-Trust). Die WCF unterstützt die Verwendung beider WS-Addressing-Versionen mit anderen Infrastrukturprotokollen. WCF-Endpunkte unterstützen eine WS-Addressing-Version pro Endpunkt.
Für R3111 muss der Namespace des EndpointReference
-Elements oder -Typs, das bzw. der in den über einen WCF-Endpunkt ausgetauschten Nachrichten verwendet wird, der WS-Addressing-Version entsprechen, die von diesem Endpunkt implementiert wird.
Wenn beispielsweise ein WCF-Endpunkt WS-ReliableMessaging implementiert, verwendet der AcksTo
-Header, der von einem derartigen Endpunkt in CreateSequenceResponse
zurückgegeben wird, die WS-Addressing-Version, die das EncodingBinding
-Element für diesen Endpunkt angibt.
Endpunktverweise und Metadaten
Eine Anzahl von Szenarien erfordert kommunizierende Metadaten oder einen Verweis auf Metadaten für einen bestimmten Endpunkt.
B3121: Die WCF wendet Mechanismen an, die in Abschnitt 6 der WS-MetadataExchange-Spezifikation (MEX) beschrieben werden, um Metadaten für Endpunktverweise nach Wert oder Verweis aufzunehmen.
Stellen Sie sich ein Szenario vor, in dem ein WCF-Dienst die Authentifizierung über ein SAML-Token (Security Assertions Markup Language) erfordert, das vom Tokenaussteller unter http://sts.fabrikam123.com
ausgestellt wurde. Der WCF-Endpunkt beschreibt diese Authentifizierungsanforderung durch Verwendung der sp:IssuedToken
-Assertion mit einer geschachtelten sp:Issuer
-Assertion, die auf den Tokenaussteller verweist. Clientanwendungen, die auf die sp:Issuer
-Assertion zugreifen, müssen mit dem Tokenausstellerendpunkt kommunizieren können. Der Client muss Metadaten über den Tokenaussteller kennen. Durch die Nutzung der Erweiterungen für Endpunkt-Verweismetadaten, die in MEX definiert sind, bietet die WCF einen Verweis auf die Tokenaussteller-Metadaten.
<sp:IssuedToken>
<sp:Issuer>
<wsa10:Address>
http://sts.fabrikam123.com
</wsa10:Address>
<wsa10:Metadata>
<mex:Metadata>
<mex:MetadataSection>
<mex:MetadataReference>
<wsa10:Address>
http://sts.fabrikam123.com/mex
</wsa10:Address>
</mex:MetadataReference>
</mex:MetadataSection>
</mex:Metadata>
</wsa10:Metadata>
</sp:Issuer>
</sp:IssuedToken>
Nachrichtenadressierungsheader
Nachrichtenheader
Die WCF verwendet für beide WS-Addressing-Versionen die folgenden Nachrichtenheader gemäß den Spezifikationen wsa:To
, wsa:ReplyTo
, wsa:Action
, wsa:MessageID
und wsa:RelatesTo
.
B3211: Für beide WS-Addressing-Versionen akzeptiert die WCF die WS-Addressing-Nachrichtenheader wsa:FaultTo
und wsa:From
, erstellt sie aber nicht selbst.
Anwendungen, die mit WCF-Anwendungen interagieren, können diese Nachrichtenheader hinzufügen, und WCF verarbeitet sie dementsprechend.
Verweisparameter und -eigenschaften
Die WCF implementiert die Verarbeitung von Endpunkt-Verweisparametern und Verweiseigenschaften in Übereinstimmung mit den jeweiligen Spezifikationen.
B3221: Wenn die WCF-Endpunkte für die Verwendung von WS-Addressing 2004/08 konfiguriert sind, machen sie keinen Unterschied zwischen der Verarbeitung von Verweiseigenschaften und Verweisparametern.
Nachrichtenaustauschmuster
Die Nachrichtensequenz beim Aufruf des Webdienstvorgangs wird als Nachrichtenaustauschmuster bezeichnet. Die WCF unterstützt unidirektionale Austauschmuster sowie Anfrage-Antwort- und Duplexnachrichten-Austauschmuster. Dieser Abschnitt klärt die WS-Adressierungsanforderungen während der Nachrichtenverarbeitung, die vom verwendeten Nachrichtenaustauschmuster abhängig sind.
Überall in diesem Abschnitt sendet der Anforderungsdienst die erste Nachricht, und der Antwortdienst empfängt die erste Nachricht.
Unidirektionale Nachricht
Wenn ein WCF-Endpunkt so konfiguriert ist, dass er Nachrichten mit einer angegebenen Action
unterstützt, sodass sie ein unidirektionales Muster befolgen, befolgt der WCF-Endpunkt die folgenden Verhaltensmuster und Anforderungen. Sofern nicht anders angegeben, gelten die Verhaltensmuster und Regeln für beide von der WCF unterstützten WS-Addressing-Versionen:
R3311: Der Anforderungsdienst muss
wsa:To
,wsa:Action
und Header für alle Verweisparameter, die vom Endpunktverweis angegeben werden, enthalten. Wenn die WS-Adressierung 2004/08 verwendet wird und [Verweiseigenschaften] vom Endpunktverweis angegeben werden, müssen auch die entsprechenden Header der Nachricht hinzugefügt werden.B3312: Der Anforderungsdienst kann
MessageID
-,ReplyTo
- undFaultTo
-Header enthalten. Die Empfängerinfrastruktur ignoriert sie, und sie werden an die Anwendung übergeben.R3313: Wenn HTTP verwendet wird und keine Nachricht an den HTTP-Antwortzweig gesendet wird, muss der Antwortdienst eine HTTP-Antwort ohne Text und mit einem HTTP 202-Statuscode senden.
Wenn die HTTP-Transportmethode verwendet wird und der Vorgangsvertrag eine Nachricht als unidirektional ausweist, kann die HTTP-Antwort immer noch zum Senden von Infrastrukturnachrichten verwendet werden – Reliable Messaging kann beispielsweise eine
SequenceAcknowledgement
-Nachricht in einer HTTP-Antwort senden.B3314: Der WCF-Antwortdienst sendet keine Fehlermeldung als Antwort auf eine unidirektionale Nachricht.
Anforderung-Antwort
Wenn ein WCF-Endpunkt für eine Nachricht mit einer bestimmten Action
so konfiguriert ist, dass er das Anforderung-Antwort-Muster befolgt, befolgt der WCF-Endpunkt die unten stehenden Verhaltensmuster und Anforderungen. Sofern nicht anders angegeben, gelten die Verhaltensmuster und Regeln für beide von der WCF unterstützten WS-Addressing-Versionen:
R3321: Der Anforderungsdienst muss in der Anforderung
wsa:To
,wsa:Action
,wsa:MessageID
und Header für alle Verweisparameter oder Verweiseigenschaften (oder beides) enthalten, die vom Endpunktverweis angegeben werden.R3322: Wenn die WS-Adressierung 2004/08 verwendet wird, muss
ReplyTo
auch in der Anforderung enthalten sein.R3323: Wenn WS-Addressing 1.0 verwendet und
ReplyTo
in der Anforderung nicht enthalten ist, wird ein Standardendpunktverweis mit der [address]-Eigenschaft verwendet, diehttp://www.w3.org/2005/08/addressing/anonymous
entspricht.R3324: Der Anforderungsdienst muss in der Antwortnachricht die Header
wsa:To
,wsa:Action
undwsa:RelatesTo
sowie Header für alle Verweisparameter oder Verweiseigenschaften (oder beides) enthalten, die vomReplyTo
-Endpunktverweis in der Anforderung angegeben werden.
Fehler bei Web Services Addressing
R3411: Die WCF generiert die folgenden, von der WS-Addressing-Version 2004/08 definierten Fehler.
Code | Ursache |
---|---|
wsa:DestinationUnreachable |
Die Nachricht ist mit ReplyTo angekommen, das sich von der Antwortadresse, die für diesen Kanal festgelegt ist, unterscheidet; für die in der To-Headerzeile angegebene Adresse gibt es kein Endpunkt-Listening. |
wsa:ActionNotSupported |
Die Infrastrukturkanäle und -verteiler, die mit dem Endpunkt verbunden sind, erkennen die Aktion, die in der Headerzeile Action angegeben ist, nicht. |
R3412: Die WCF generiert die folgenden, von der WS-Addressing-Version 1.0 definierten Fehler.
Code | Ursache |
---|---|
wsa10:InvalidAddressingHeader |
Duplizieren Sie wsa:To , wsa:ReplyTo , wsa:From oder wsa:MessageID . Duplizieren Sie wsa:RelatesTo mit demselben RelationshipType . |
wsa10:MessageAddressingHeaderRequired |
Der erforderliche Adressierungsheader fehlt. |
wsa10:DestinationUnreachable |
Die Nachricht ist mit ReplyTo angekommen, das sich von der Antwortadresse, die für diesen Kanal eingeführt wurde, unterscheidet. An der Adresse, die im To-Header angegeben ist, gibt es kein Endpunkt-Listening. |
wsa10:ActionNotSupported |
Eine Aktion, die im Action -Header angegeben ist, wird von den Infrastrukturkanälen oder dem Verteiler, die/der mit dem Endpunkt verbunden sind/ist, nicht erkannt. |
wsa10:EndpointUnavailable |
Der RM-Kanal schickt diesen Fehler zurück und gibt an, dass der Endpunkt die Sequenz basierend auf einer Untersuchung der Adressheader der Nachricht CreateSequence nicht verarbeiten wird. |
Code in den vorangehenden Tabellen wird auf FaultCode
in SOAP 1.1 und SubCode
(mit Code=Sender) in SOAP 1.2 abgebildet.
WSDL 1.1-Bindung und WS-Richtlinienassertionen
Angeben der Verwendung von WS-Adressierung
Die WCF verwendet Richtlinienassertionen, um die Endpunktunterstützung für eine bestimmte WS-Addressing-Version anzugeben.
Die folgende Richtlinienassertion verfügt über das Endpoint Policy Subject [WS-PA] und gibt an, dass von diesem Endpunkt gesendete und empfangene Nachrichten WS-Adressierung 2004/08 verwenden müssen.
<wsap:UsingAddressing />
Diese Richtlinienassertion erweitert die Spezifikation zur WS-Adressierung 2004/08.
Die folgende Richtlinienassertion gibt an, dass gesendete/empfangene Nachrichten die WS-Adressierung 1.0 verwenden müssen.
<wsam:Addressing/>
Die folgende Richtlinienassertion verfügt über ein Endpoint Policy Subject [WS-PA] und gibt an, dass von diesem Endpunkt gesendete und empfangene Nachrichten WS-Adressierung 2004/08 verwenden müssen.
<wsaw10:UsingAddressing />
Das Element wsaw10:UsingAddressing
wird aus der [WS-Addressing-WSDL] ausgeliehen und im Kontext von WS-Policy entsprechend der Spezifikation, Abschnitt 3.1.2, verwendet.
Die Nutzung von Adressing verwendet nicht die Semantik von WSDL 1.1-, SOAP 1.1- und SOAP 1.2 HTTP-Bindungen. Wenn beispielsweise eine Antwort auf eine Anfrage erwartet wird, die an einen Endpunkt gesendet wird, der Addressing und WSDL SOAP 1.x HTTP-Bindung verwendet, muss die Antwort unter Verwendung der HTTP-Antwort gesendet werden.
Die WS-AM-Assertion von Antworten, die über die HTTP-Antwort gesendet werden, ist Folgende:
<wsam:AnonymousResponses/>
Die vollständige Richtlinienassertion kann wie folgt aussehen:
<wsam:Addressing>
<wsp:Policy>
<wsam:AnonymousResponses />
</wsp:Policy>
</wsam:Addressing>
Es gibt aber Nachrichtenaustauschmuster, die davon profitieren, zwei unabhängige, entgegengesetzte HTTP-Verbindungen zwischen dem Anforderungsdienst und dem Antwortdienst etabliert zu haben, z. B. unaufgeforderte unidirektionale Nachrichten, die vom Antwortdienst gesendet werden.
Die WCF bietet ein Feature, über das zwei zugrunde liegende Transportkanäle einen Composite-Duplex-Kanal bilden können, bei dem ein Kanal für eingehende Nachrichten und der andere für ausgehende Nachrichten verwendet wird. Im Fall des HTTP-Transports stellt Composite Duplex zwei umgekehrte HTTP-Verbindungen bereit. Der Anforderungsdienst verwendet eine Verbindung, um Nachrichten an den Antwortdienst zu senden, und der Antwortdienst verwendet die andere, um Nachrichten zurück an den Anforderungsdienst zu senden.
Die WS-AM-Assertion von Antworten, die über separate HTTP-Anforderungen gesendet werden, ist Folgende:
<wsam:NonAnonymousResponses/>
Die vollständige Richtlinienassertion kann wie folgt aussehen:
<wsam:Addressing>
<wsp:Policy>
<wsam:NonAnonymousResponses />
</wsp:Policy>
</wsam:Addressing>
Die Verwendung der folgenden Assertion, die über Endpoint Policy Subject [WS-PA] an Endpunkten verfügt, die WSDL 1.1 SOAP 1.x HTTP-Bindungen verwenden, erfordert zwei einzelne entgegengesetzte HTTP-Verbindungen, die jeweils für den Nachrichtenfluss vom Anforderungsdienst an den Antwortdienst bzw. vom Antwortdienst an den Anforderungsdienst verwendet werden.
<cdp:CompositeDuplex/>
Die vorherige Anweisung führt bei Anforderungsnachrichten zu den folgenden Anforderungen an den wsa:ReplyTo
-Header:
R3514: Die an einen Endpunkt gesendeten Anforderungsnachrichten müssen einen
ReplyTo
-Header umfassen, dessen[address]
-Eigenschaft nichthttp://www.w3.org/2005/08/addressing/anonymous
entspricht, wenn der Endpunkt eine WSDL 1.1 SOAP 1.x-HTTP-Bindung verwendet und über eine Richtlinienalternative verfügt, der eine mitcdp:CompositeDuplex
verbundenewsap10:UsingAddressing
- oderwsap:UsingAddressing
-Assertion angehängt ist.R3515: Die an einen Endpunkt gesendeten Anforderungsnachrichten müssen einen
ReplyTo
-Header umfassen, dessen[address]
-Eigenschafthttp://www.w3.org/2005/08/addressing/anonymous
entspricht, oder sie dürfen keinenReplyTo
-Header umfassen, wenn der Endpunkt eine WSDL 1.1 SOAP 1.x-HTTP-Bindung verwendet und über eine Richtlinienalternative mitwsap10:UsingAddressing
-Assertion und keinecdp:CompositeDuplex
-Assertion verfügt.R3516: Die an einen Endpunkt gesendeten Anforderungsnachrichten müssen einen
ReplyTo
-Header mit einer[address]
-Eigenschaft umfassen, diehttp://www.w3.org/2005/08/addressing/anonymous
entspricht, wenn der Endpunkt eine WSDL 1.1 SOAP 1.x-HTTP-Bindung verwendet und über eine Richtlinienalternative verfügt, der einewsap:UsingAddressing
- und keinecdp:CompositeDuplex
-Assertion angehängt ist.
Die WS-Adressierung-WSDL-Spezifikation versucht, ähnliche Protokollbindungen zu beschreiben, indem sie ein <wsaw:Anonymous/>
-Element mit drei Textwerten (erforderlich, optional und verboten) einführt, um die Anforderungen im wsa:ReplyTo
-Header (Abschnitt 3.2) anzugeben. Leider ist eine derartige Elementdefinition im Kontext einer WS-Richtlinie als Assertion nicht besonders nützlich, da sie domänenspezifische Erweiterungen benötigt, um den Knotenpunkt von Alternativen zu unterstützen, die ein derartiges Element als Assertion verwenden. Eine derartige Elementdefinition gibt außerdem den Wert des ReplyTo
-Headers als Gegenstück zum Endpunktverhalten auf dem Kabel an und macht ihn somit spezifisch für den HTTP-Transport.
Aktionsdefinition
WS-Adressierung 2004/08 definiert ein wsa:Action
-Attribut für die wsdl:portType/wsdl:operation/[wsdl:input | wsdl:output | wsdl:fault]
-Elemente. WS-Adressierung 1.0 WSDL-Bindung (WS-ADDR10-WSDL) definiert ein ähnliches Attribut, wsaw10:Action
.
Der einzige Unterschied zwischen den beiden ist die Standardaktionsmustersemantik, die in Abschnitt 3.3.2 von WS-ADDR bzw. Abschnitt 4.4.4 der 4.4.4 von WS-ADDR10-WSDL beschrieben wird.
Es ist sinnvoll, zwei Endpunkte zu verwenden, die sich denselben portType
(bzw. „Vertrag“ in der WCF-Terminologie) aufweisen, aber verschiedene WS-Addressing-Versionen verwenden. Da aber "Aktion" durch den portType
definiert wird und sich nicht zwischen den Endpunkten, die den portType
implementieren, ändern sollte, ist es unmöglich, beide Standardaktionsmuster zu unterstützen.
Um diese Kontroverse aufzulösen, unterstützt die WCF eine einzelne Version des Action
-Attributs.
B3521: Die WCF verwendet das wsaw10:Action
-Attribut für wsdl:portType/wsdl:operation/[wsdl:input | wsdl:output | wsdl:fault]
-Elemente gemäß der Definition in WS-ADDR10-WSDL, um den Action
-URI unabhängig von der vom Endpunkt verwendeten WS-Addressing-Version für die entsprechenden Nachrichten zu bestimmen.
Verwenden des Endpunktverweises im WSDL-Anschluss
Abschnitt 4.1 von WS-ADDR10-WSDL erweitert das wsdl:port
-Element durch das untergeordnete <wsa10:EndpointReference…/>
-Element, um den Endpunkt in WS-Adressierungsbegriffen zu beschreiben. Die WCF erweitert dieses Hilfsprogramm in WS-Addressing 2004/08, wodurch ermöglicht wird, dass <wsa:EndpointReference…/>
als untergeordnetes Element von wsdl:port
angezeigt wird.
R3531: Wenn einem Endpunkt eine Richtlinienalternative mit einer
<wsaw10:UsingAddressing/>
wsdl:port
enthalten.R3532: Wenn
wsdl:port
das untergeordnete Element<wsa10:EndpointReference …/>
enthält, muss der Wert des untergeordneten Elementswsa10:EndpointReference/wsa10:Address
dem Wert des@address
-Attributs des gleichgeordneten Elementswsdl:port
/wsdl:location
entsprechen.R3533: Wenn einem Endpunkt eine Richtlinienalternative mit einer
<wsap:UsingAddressing/>
wsdl:port
enthalten.R3534: Wenn
wsdl:port
das untergeordnete Element<wsa:EndpointReference …/>
enthält, muss der Wert des untergeordneten Elementswsa:EndpointReference/wsa:Address
dem Wert des@address
-Attributs des gleichgeordneten Elementswsdl:port
/wsdl:location
entsprechen.
Gestaltung mit WS-Sicherheit
Gemäß den Sicherheitsüberlegungsabschnitten in WS-ADDR und WS-ADDR10 wird empfohlen, dass alle adressierenden Header zusammen mit dem Nachrichtentext signiert werden, um sie zusammenzubinden.
Wenn WS-Sicherheit für den Nachrichtenintegritätsschutz verwendet wird, müssen die WS-Adressierungs-Nachrichtenheader genauso wie die Header, die aus Referenzparametern oder -eigenschaften (oder beidem) entstanden sind, zusammen mit dem Text der Nachricht signiert werden.
Beispiele
Unidirektionale Nachricht
In diesem Szenario sendet der Absender eine unidirektionale Nachricht zum Empfänger. SOAP 1.2, HTTP 1.1 und W3C WS-Adressierung 1.0 werden verwendet.
Die Anforderungsnachrichtenstruktur: Zu den Nachrichtenheadern gehören die Elemente wsa10:To
und wsa10:Action
. Der Nachrichtentext schließt ein bestimmtes <app:Ping>
-Element vom Anwendungsnamespace ein.
HTTP-Header: Das Ziel in POST stimmt mit dem URI im Element wsa10:To
überein.
Der Content-Type-Header entspricht dem Wert application/soap+xml
, wie von SOAP 1.2 vorausgesetzt. Die Parameter charset
und action
sind eingeschlossen. Der Parameter action
des Content-Type-Headers entspricht dem Wert des wsa10:Action
-Nachrichtenheaders.
POST http://fabrikam123.com/Service HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8;
action="http://fabrikam123.com/Service/OneWay"
Host: 131.107.72.15
Content-Length: 1501
Expect: 100-continue
Proxy-Connection: Keep-Alive
<s12:Envelope>
<s12:Header>
<wsa10:To s12:mustUnderstand="1">
http://fabrikam123.com/Service
</wsa10:To>
<wsa10:Action s12:mustUnderstand="1">
http://fabrikam123.com/Service/OneWay
</wsa10:Action>
</s12:Header>
<s12:Body>
<Ping xmlns="http://fabrikam123.com/Service/">
<Text>Hello World</Text>
</Ping>
</s12:Body>
</s12:Envelope>
Der Empfänger antwortet mit einer leeren HTTP-Antwort und dem Status 202. Ein Beispiel für die HTTP-Antwort:
HTTP/1.1 202 Accepted
Date: Fri, 15 Jul 2005 08:56:07 GMT
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50215
Cache-Control: private
Content-Length: 0
SOAP-Nachrichten-Übertragungsoptimierungsmechanismus
In diesem Abschnitt werden die WCF-Implementierungsdetails für den HTTP-SOAP-MTOM-Ansatz beschrieben. Die MTOM-Technologie ist ein SOAP-Nachrichtencodierungsmechanismus derselben Klasse wie die traditionelle Text-/XML-Codierung bzw. WCF-Binärcodierung. Zu MTOM gehören folgende Elemente:
Ein XML-Codierungs- und Verpackungsmechanismus, der von [XOP] beschrieben wird, und XML-Informationselemente, die base64-codierte Binärdaten enthalten, die in einzelne Binärteile optimiert wurden.
Eine MIME-Kapselung des XOP-Pakets, das das XML-Infoset und jeden Binärteil des XOP-Pakets in einen einzelnen MIME-Teil serialisiert.
Eine MIME-XOP-Codierung, die auf SOAP 1.x Envelope angewendet wird.
Eine HTTP-Transportbindung.
Es ist möglich, MTOM bei Nicht-HTTP-Transportmethoden mit der WCF zu verwenden. In diesem Thema konzentrieren wir uns jedoch auf HTTP.
Das MTOM-Format setzt einen großen Satz von Spezifikationen ein, der MTOM selbst, XOP und MIME abdeckt. Die Modularität dieses Spezifikationssatzes macht es schwierig, die genauen Anforderungen an die Format- und Verarbeitungssemantik zu rekonstruieren. In diesem Abschnitt werden die Format- und Verarbeitungsanforderungen an MTOM-HTTP-Bindungen beschrieben.
MTOM-Nachrichtencodierung
Generieren von MTOM-Nachrichten
[XOP] Abschnitt 3.1 beschreibt den Vorgang der Codierung von XML mit Elementinformationselementen, die base24-Werte enthalten, in ein abstrakt definiertes XOP-Paket.
Die folgende Sequenz von Schritten beschreibt den MTOM-spezifischen Codierungsprozess:
Stellen Sie sicher, dass der zu codierende SOAP-Umschlag kein Elementinformationselement mit dem
[namespace name]
http://www.w3.org/2004/08/xop/include
und dem[local name]
Include
enthält.Erstellen Sie ein leeres MIME-Paket.
Identifizieren Sie die Elementinformationselemente, die optimiert werden sollten, innerhalb des Original XML Infoset. Für die zu optimierenden Elemente müssen die Zeichen, aus denen das untergeordnete Element (
[children]
) des Elementinformationselements besteht, die vorschriftsmäßige Formxs:base64Binary
aufweisen (siehe XSD-2, 3.2.16 base64Binary) und dürfen keine Leerzeichen enthalten, die vor dem Nicht-Leerzeichen-Inhalt, in der gleichen Zeile oder dahinter stehen.Erstellen Sie einen XOP SOAP-Umschlag, der eine Kopie des Original-SOAP-Umschlags ist, aber bei dem das untergeordnete Element jedes Elementinformationselements, das im vorherigen Schritt identifiziert wurde, durch ein
xop:Include
-Elementinformationselement ersetzt wurde, das wie folgt erstellt wird:Transformieren Sie die ersetzten Zeichen in Binärdaten, indem Sie sie als base64-codierte Daten verarbeiten.
Generieren Sie einen eindeutigen Content-ID-Headerwert, der die Anforderungen R3133 und R3134 zufriedenstellt.
Generieren Sie einen Content-Transfer-Encoding-MIME-Header mit dem Wert "binär".
Wenn das optimierte Elementinformationselement (das [übergeordnete Element] des neu eingefügten
xop:Include
-Elementinformationselements) einxmime:contentType
-Attributelement besitzt, generieren Sie einen Content-Type-MIME-Header mit dem Wert desxmime:contentType
-Attributs.Generieren Sie ein neues MIME-Teil mit einem Inhalt aus Binärdaten, die aus den ersetzten Zeichen entschlüsselt wurden, die als base64, Content-ID-Header aus 4b, Content-Transfer-Encoding-Header und Content-Type-Header bei Generierung in Schritt 4d aus 4c verarbeitet wurden.
Fügen Sie ein
href
-Attribut zumxop:Include
-Element mit dem Wert "cid: uri" hinzu, der in Schritt 4b aus dem Content-ID-Headerwert erstellt wurde. Entfernen Sie die einschließenden Zeichen "<" und ">", versehen Sie die verbleibende Zeichenfolge mit URL-Escape, und fügen Sie das Präfixcid:
hinzu. Der folgende minimale Zeichensatz ist erforderlich, um RFC1738 und RFC2396 mit einem Escapezeichen zu versehen. Andere Zeichen können mit Escapezeichen versehen werden.Hexadecimal 00-1F , 7F, 20, "<" | ">" | "#" | "%" | <"> "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`" | "~" | "^"
Erstellen Sie ein Stamm-MIME-Teil mit dem XOP SOAP-Umschlag aus Schritt 4.
Schreiben Sie die HTTP-Header, einschließlich des HTTP Content-Type-Headers.
Schreiben Sie das MIME-Paket.
Verarbeiten von MTOM-Nachrichten
Die Verarbeitung einer MTOM-Nachricht ist das genaue Gegenteil des Vorgangs, der im vorangehenden Abschnitt "Generieren von MTOM-Nachrichten" beschrieben wurde:
Stellen Sie sicher, dass der Stamm-MIME-Teil den Content-Type
application/xop+xml
hat.Erstellen Sie einen SOAP-Umschlag, indem Sie den Stamm-MIME-Teil des Pakets als XML-Dokument analysieren. Die Zeichencodierung wird vom Parameter
charset
des Content-Type des Stamm-MIME-Teils bestimmt.Für jedes Elementinformationselement im erstellten SOAP-Umschlag, der, als einziges Mitglied seiner [untergeordneten] Eigenschaft, ein
xop:Include
-Elementinformationselement enthält:Löschen Sie das Präfix
cid:
, und entfernen Sie alle URI-Escape-Zeichensequenzen (RFC 2396) im Wert des@href
-Attributs des Elementsxop:Include
. Schließen Sie die Ergebniszeichenfolge in "<", ">" ein.Suchen Sie den MIME-Teil mit dem Content-ID-Headerwert, der mit der in Schritt 3a abgeleiteten Zeichenfolge übereinstimmt.
Ersetzen Sie das Elementinformationselement
xop:Include
, das in der Eigenschaftchildren
jedes Elements vorkommt, durch Zeicheninformationselemente, die die vorschriftsmäßige base64-Codierung (siehe XSD-2, 3.2.16 base64Binary) des Entitätstexts des in Schritt 3b identifizierten MIME-Teils repräsentieren (ersetzen Sie wirksam das Elementinformationselementxop:Include
durch die Daten, die im Paketteil rekonstruiert wurden).
HTTP Content-Type Header
Im Folgenden finden Sie eine Liste der WCF-Erklärungen für das Format des HTTP-Content-Type-Headers einer SOAP 1.x MTOM-verschlüsselten Nachricht, das anhand der in der MTOM-Spezifikation selbst genannten Anforderungen sowie anhand von MTOM und RFC 2387 abgeleitet wird.
R4131: Ein HTTP-Content-Type-Header muss den Wert mehrteilig/verwandt (Groß- und Kleinschreibung nicht beachtend) und seine Parameter besitzen. Bei den Parameternamen braucht die Groß- und Kleinschreibung nicht berücksichtigt werden. Die Parameterreihenfolge ist nicht wichtig.
Das komplette Backus-Naur Form (BNF) des Content-Type-Headers für MIME-Nachrichten wird in RFC 2045, Abschnitt 5.1 aufgeführt.
R4132: Ein HTTP Content-Type-Header muss über einen Typparameter mit dem Wert
application/xop+xml
verfügen, der von doppelten Anführungszeichen umschlossen ist.
Während die Anforderung, Anführungszeichen zu verwenden, in RFC 2387 nicht explizit ist, vermerkt der Text, dass alle der mehrteiligen bzw. verwandten Medientypparameter am wahrscheinlichsten reservierte Zeichen wie "@" oder "/" enthalten und daher doppelte Anführungszeichen benötigen.
R4133: Ein HTTP Content-Type-Header sollte einen Startparameter mit dem Wert des Content-ID-Headers des MIME-Teils, der den SOAP 1.x Envelope enthält, in doppelten Anführungszeichen besitzen. Wenn der Startparameter weggelassen wird, muss der erste MIME-Teil den SOAP 1.x Envelope enthalten.
R4134: Zum HTTP Content-Type-Header für eine SOAP 1.1 MTOM-codierte Nachricht muss der Startinfo-Parameter, umgeben von doppelten Anführungszeichen, mit dem Wert von text/xml gehören.
R4135: Zum HTTP Content-Type-Header für eine SOAP 1.2 MTOM-codierte Nachricht muss der Startinfo-Parameter mit dem Wert von
application/soap+xml
, umgeben von doppelten Anführungszeichen, gehören.R4136: Der HTTP Content-Type-Header für eine SOAP 1.x MTOM-codierte Nachricht muss den Grenzparameter mit dem Wert (umgeben von doppelten Anführungszeichen), der der MIME-Grenz-BNF entspricht, die in RFC 2046, Abschnitt 5.1.1 definiert wird, enthalten.
boundary := 0*69<bchars> bcharsnospace bchars := bcharsnospace / " " bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / "_" / "," / "-" / "." / "/" / ":" / "=" / "?"
Beispiele:
RICHTIG
Content-Type: multipart/related; type="application/xop+xml";start=" <part0@tempuri.org>";boundary="uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=1";start-info="text/xml"
RICHTIG
Content-Type: Multipart/Related; type="application/xop+xml";start-info="text/xml";boundary="uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=1"
FALSCH
Content-Type: Multipart/Related; type=application/xop+xml;start=" <part0@tempuri.org>";start-info="text/xml";boundary="uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=1"
Infoset-MIME-Teil
SOAP 1.x Envelope ist als Stammteil des XOP MIME-Paket gekapselt und wird häufig der infoset
-Teil genannt.
R4141: SOAP 1.x Envelope muss als Stammteil des XOP MIME-Pakets, das als
infoset
-Teil bezeichnet wird und auf das vom HTTP Content-Type verwiesen wird, gekapselt werden.R4142: Der SOAP-
Infoset
-Teil muss die folgenden MIME-Köpfe einschließen:Content-ID
,Content-Transfer-Encoding
undContent-Type
.
Das Format des Content-ID-Headers wird von RFC 2045 als
"Content-ID" ":" msg-id
definiert, wobei msg-id
in RFC 2822 (das RFC 822, auf das in RFC 2045 verwiesen wird, ablöst) als:
msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]
Hierbei handelt es sich effektiv um eine in "<" und ">" eingeschlossene E-Mail-Adresse. Das [CFWS]
-Präfix und -Suffix wurden in RFC 2822 hinzugefügt, um Kommentare auszuführen, und sollten nicht verwendet werden, um die Kompatibilität aufrechtzuerhalten.
R4143: Der Wert des Content-ID-Headers des Infoset MIME-Teils muss der Produktion msg-id
von RFC 2822 folgen, wobei die Präfix- und Suffixteile des [CFWS]
entfallen.
Für eine Reihe von MIME-Implementierungen wurden die Anforderungen für den Wert, der in "<" und ">" eingeschlossen ist, so gelockert, dass er eine E-Mail-Adresse ist und zusätzlich zur E-Mail-Adresse den in "<", ">" eingeschlossenen absoluteURI
verwendet. Diese Version der WCF verwendet Werte des Content-ID-MIME-Headers in folgender Form:
Content-ID: <http://tempuri.org/0>
R4144: MTOM-Prozessoren sollten Content-ID-Headerwerte akzeptieren, die der folgenden entspannten msg-id
entsprechen.
msg-id-relaxed = [CFWS] "<" (absoluteURI | mail-address) ">" [CFWS]
mail-address = id-left "@" id-right
MIME (RFC 2045) stellt den Content-Transfer-Encoding-Header bereit, um die Codierung des Inhalts des MIME-Teils zu übermitteln. Der für das Content-Transfer-Encoding definierte Standard ist 7-Bit; da dies für die meisten SOAP-Nachrichten nicht geeignet ist, wird der Content-Transfer-Encoding-Header für eine bessere Interoperabilität benötigt:
R4145: Der SOAP-Infosetteil muss den Content-Transfer-Encoding-Header enthalten.
R4146: Wenn die SOAP-Umschlag-Zeichencodierung UTF-8 ist, muss der Wert des Content-Transfer-Encoding-Headers 8-Bit sein.
R4147: Wenn die SOAP-Umschlag-Zeichencodierung UTF-16 ist, muss der Wert des Content-Transfer-Encoding-Headers binär sein.
Gemäß [XOP] Abschnitt 5,
R4148: Ein SOAP 1.1-Infosetteil muss den Content-Type-Header mit dem Medientyp "application/xop+xml" und Parametertyp "text/xml" sowie „charset“ enthalten.
Content-Type: application/xop+xml; charset=utf-8;type="text/xml"
R4149: Der SOAP 1.2-Infosetteil muss den Content-Type-Header mit dem Medientyp
application/xop+xml
und Parametertyp "application/soap+xml
" sowiecharset
enthalten.Content-Type: application/xop+xml; charset=utf-8;type="application/soap+xml"
Obwohl XOP den Parameter
charset
fürapplication/xop+xml
als optional definiert, wird er ähnlich der BP 1.1-Anforderung an den Parametercharset
des Medientypstext/xml
für die Interoperabilität benötigt.R4140: Die Parameter
type
undcharset
müssen im Content-Type-Header des SOAP 1.x-Infosetteils enthalten sein.
WCF-Endpunkt-Unterstützung für MTOM
Der Zweck von MTOM ist es, eine SOAP-Nachricht zu codieren, um base64-codierte Daten zu optimieren. Die folgende Liste führt Einschränkungen auf:
R4151: Jedes Elementinformationselement, das base64-codierte Daten enthält, kann optimiert werden.
B4152: Die WCF optimiert Elementinformationselemente, die base64-codierte Daten enthalten und deren Länge 1024 Bytes überschreitet.
Ein WCF-Endpunkt, der für die Verwendung von MTOM konfiguriert wird, sendet immer MTOM-codierte Nachrichten. Selbst wenn kein Teil die erforderlichen Kriterien erfüllt, ist die Nachricht noch immer MTOM-codiert (als MIME-Paket mit einem einzelnen MIME-Teil serialisiert, der den SOAP-Umschlag enthält).
WS-Policy-Assertion für MTOM
Die WCF verwendet die folgende Richtlinienassertion, um die MTOM-Verwendung durch den Endpunkt anzugeben:
<wsoma:OptimizedMimeSerialization />
R4211: Die vorangehende Richtlinienassertion verfügt über ein Endpoint Policy Subject und gibt an, dass alle Nachrichten, die an den Endpunkt gesendet und von diesem empfangen werden, durch den Einsatz von MTOM optimiert werden.
B4212: Bei der Konfiguration für die Verwendung der MTOM-Optimierung fügt ein WCF-Endpunkt der Richtlinie, die an die entsprechende
wsdl:binding
angehängt ist, eine MTOM-Richtlinienassertion hinzu.
Gestaltung mit WS-Sicherheit
MTOM ist ein Codierungsmechanismus, der text/xml
und der XML für WCF-Binärdateien ähnelt. MTOM bietet eine natürliche Zusammensetzung aus WS-Sicherheit und anderen WS-*-Protokollen: eine über WS-Sicherheit gesicherte Nachricht kann durch den Einsatz von MTOM optimiert werden.
Beispiele
WCF-SOAP 1.1-Nachricht, mit MTOM codiert
POST http://131.107.72.15/Mtom/svc/service.svc/Soap11MtomUTF8 HTTP/1.1
SOAPAction: "http://xmlsoap.org/echoBinaryAsString"
Content-Type: multipart/related;type="application/xop+xml";
start="<http://tempuri.org/0>";start-info="text/xml";
boundary="uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=1"
Host: 131.107.72.15
Content-Length: 1501
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=1
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<EchoBinaryAsString xmlns="http://xmlsoap.org/Ping">
<array>
<xop:Include
href="cid:http%3A%2F%2Ftempuri.org%2F1%2F632618206521093670"
xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</array>
</EchoBinaryAsString>
</s:Body>
</s:Envelope>
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=1
Content-ID: <http://tempuri.org/1/632618206521093670>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream
…Binary Content..
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=1
WCF Secure SOAP 1.2-Nachricht, mit MTOM codiert
In diesem Beispiel wird eine Nachricht mit MTOM und SOAP 1.2 codiert, die mit WS-Sicherheit geschützt wird. Die für die Codierung identifizierten Binärteile sind die Inhalte des BinarySecurityToken
, CipherValue
der EncryptedData
, die zu der verschlüsselten Signatur und dem verschlüsselten Text gehören. Beachten Sie, dass der CipherValue
des EncryptedKey
von der WCF nicht zur Optimierung identifiziert wurde, da seine Länge weniger als 1024 Bytes beträgt.
POST http://131.107.72.15/Mtom/service.svc/Soap12MtomSecureSignEncrypt HTTP/1.1
Content-Type: multipart/related; type="application/xop+xml";
start="<http://tempuri.org/0>";
boundary="uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=3";
start-info="application/soap+xml";
action="http://xmlsoap.org/echoBinaryAsString"
Host: 131.107.72.15
Content-Length: 1941
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=3
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="uuid-4d4ee765-5717-4d53-9ac9-99bddc07df6c-5">
<u:Created>2005-09-09T06:57:32.488Z</u:Created>
<u:Expires>2005-09-09T07:02:32.488Z</u:Expires>
</u:Timestamp>
<o:BinarySecurityToken u:Id="uuid-4d4ee765-5717-4d53-9ac9-99bddc07df6c-2" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
<xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F1%2F632618206525089430" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</o:BinarySecurityToken>
<e:EncryptedKey Id="_1" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<o:SecurityTokenReference>
<o:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier">Xeg55vRyK3ZhAEhEf+YT0z986L0=</o:KeyIdentifier>
</o:SecurityTokenReference>
</KeyInfo>
<e:CipherData> <e:CipherValue>oQfpxwT8/SAGyZQzKE2b4yO6dXuQj7pwJ+5CGL3Rf7C06bQ5ttMoQ9GLJcQYkXTzin+WwHEgs5bj5ml9HKTW9QAU5JJ6lksdymmQvWP5ZtGPBVchO4sofEGoCKmBiZL/DYS/cnbzgnc/3a6NYnc10y2fWGaGLiqa00zijAw7o0Y=</e:CipherValue>
</e:CipherData>
</e:EncryptedKey>
<c:DerivedKeyToken u:Id="_2" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
<o:SecurityTokenReference>
<o:Reference URI="#_1"/>
</o:SecurityTokenReference>
<c:Nonce>OrEPRX7fISIS4sXYWPMv3g==</c:Nonce>
</c:DerivedKeyToken>
<e:ReferenceList xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:DataReference URI="#_3"/>
<e:DataReference URI="#_4"/>
</e:ReferenceList>
<e:EncryptedData Id="_4" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<o:SecurityTokenReference>
<o:Reference URI="#_2"/>
</o:SecurityTokenReference>
</KeyInfo>
<e:CipherData>
<e:CipherValue>
<xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F2%2F632618206525089430" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</e:CipherValue>
</e:CipherData>
</e:EncryptedData>
</o:Security>
</s:Header>
<s:Body u:Id="_0">
<e:EncryptedData Id="_3" Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<o:SecurityTokenReference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<o:Reference URI="#_2"/>
</o:SecurityTokenReference>
</KeyInfo>
<e:CipherData>
<e:CipherValue>
<xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F3%2F632618206525089430" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</e:CipherValue>
</e:CipherData>
</e:EncryptedData>
</s:Body>
</s:Envelope>
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=3
Content-ID: <http://tempuri.org/1/632618206525089430>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream
...Binary content of BinarySecurityToken - X509 Certificate...
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=3
Content-ID: <http://tempuri.org/2/632618206525089430>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream
...Binary serialization of the encrypted primary signature...
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=3
Content-ID: <http://tempuri.org/3/632618206525089430>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream
...Binary serialization of the encrypted Body...
--uuid:0ca0e16e-feb1-426c-97d8-c4508ada5e82+id=3--