Interoperabilität mit POX-AnwendungenInteroperability with POX Applications

"Plain Old XML" (POX)-Anwendungen kommunizieren, indem Sie den Austausch von unformatierte HTTP-Nachrichten, die nur XML-Anwendungsdaten enthalten, die nicht in einen SOAP-Umschlag eingeschlossen ist."Plain Old XML" (POX) applications communicate by exchanging raw HTTP messages that contain only XML application data that is not enclosed within a SOAP envelope. Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) kann Dienste und Clients bereitstellen, die POX-Nachrichten verwenden. can provide both services and clients that use POX messages. Beim Dienst kann WCFWCF für die Implementierung von Diensten verwendet werden, die Endpunkte wie Webbrowser und Skriptsprachen, mit denen POX-Nachrichten gesendet und empfangen werden können, für Clients verfügbar machen.On the service, WCFWCF can be used to implement services that expose endpoints to clients such as Web browsers and scripting languages that send and receive POX messages. Auf dem Client kann das Programmiermodell von WCFWCF zur Implementierung von Clients, die mit POX-basierten Diensten kommunizieren, herangezogen werden.On the client, the WCFWCF programming model can be used to implement clients that communicate with POX-based services.

Hinweis

Dieses Dokument wurde ursprünglich für .NET Framework.NET Framework 3.0 geschrieben.This document was originally written for the .NET Framework.NET Framework 3.0. .NET Framework.NET Framework 3.5 verfügt über intergrierte Unterstützung für die Arbeit mit POX-Anwendungen. 3.5 has built-in support for working with POX applications. Weitere Informationen finden Sie unterFor more information aboutfinden Sie unter WCF Web-HTTP-Programmiermodell see WCF Web HTTP Programming Model

POX-Programmierung mit WCFPOX Programming with WCF

WCFWCFDienste, die für die Kommunikation über HTTP unter Verwendung von POX-Nachrichten mithilfe einer <CustomBinding >. services that communicate over HTTP using POX messages use a <customBinding>.

<customBinding>  
   <binding name="poxServerBinding">  
       <textMessageEncoding messageVersion="None" />  
       <httpTransport />  
   </binding>  
</customBinding>  

Diese benutzerspezifische Bindung enthält zwei Elemente:This custom binding contains two elements:

Der standardmäßige Textnachrichtenencoder von WCFWCF ist spezifisch für die Verwendung des None-Werts konfiguriert, wodurch XML-Nachrichten ohne SOAP-Envelope verarbeitet werden können.The standard WCFWCF Text Message Encoder is specially configured to use the None value, which allows it to process XML message payloads that do not arrive wrapped in a SOAP envelope.

WCFWCF-Clients, die über HTTP unter Verwendung von POX-Nachrichten kommunizieren, verwenden eine ähnliche Bindung (wie im folgenden imperativen Code zu sehen ist): clients that communicate over HTTP using POX messages use a similar binding (shown in the following imperative code).

private static Binding CreatePoxBinding()  
{  
    TextMessageEncodingBindingElement encoder =   
    new TextMessageEncodingBindingElement( MessageVersion.None, Encoding.UTF8 );  
    HttpTransportBindingElement transport = new HttpTransportBindingElement();  
    transport.ManualAddressing = true;  
    return new CustomBinding( new BindingElement[] { encoder, transport } );  
}   

Da POX-Clients die URIs, an die Nachrichten gesendet werden, explizit angeben müssen, muss das HttpTransportBindingElement in der Regel so konfiguriert werden, dass eine manuelle Adressierung möglich ist. Hierfür wird im Element die ManualAddressing-Eigenschaft auf true festgelegt.Because POX clients must explicitly specify the URIs to which they send messages, they usually must configure the HttpTransportBindingElement to a manual addressing mode by setting the ManualAddressing property to true on the element. Auf diese Weise kann die Adresse für die Nachricht explizit über Anwendungscode angegeben werden, und es muss nicht jedes Mal, wenn eine Anwendung eine Nachricht an einen anderen HTTP-URI sendet, eine neue ChannelFactory erstellt werden.This allows messages to be addressed explicitly by application code and it is not necessary to create a new ChannelFactory every time an application sends a message to a different HTTP URI.

Da bei POX-Nachrichten keine SOAP-Header für die Übermittlung wichtiger Protokollinformationen verwendet werden, müssen POX-Clients und -Dienste häufig Teile der zugrunde liegenden HTTP-Anforderung, die zum Senden und Empfangen einer Nachricht verwendet wird, manipulieren.Because POX messages do not use SOAP headers to convey important protocol information, POX clients and services often must manipulate pieces of the underlying HTTP request used to send or receive a message. HTTP-spezifische Protokollinformationen wie HTTP-Header und Statuscodes werden im WCFWCF-Programmiermodell durch zwei Klassen bereitgestellt:HTTP-specific protocol information such as the HTTP headers and status codes are surfaced in the WCFWCF programming model through two classes:

  • HttpRequestMessageProperty, die Informationen zur HTTP-Anforderung wie die HTTP-Methode und Anforderungsheader enthält.HttpRequestMessageProperty, which contains information about the HTTP request, such as the HTTP method and request headers.

  • HttpResponseMessageProperty, die Informationen zur HTTP-Antwort enthält wie den HTTP-Statuscode und die Statusbeschreibung sowie alle HTTP-Antwortheader.HttpResponseMessageProperty, which contains information about the HTTP response, such as the HTTP status code and status description, as well as any HTTP response headers.

Das folgende Codebeispiel zeigt, wie Sie eine HTTP GET-Anforderungsnachricht mit der Adresse http://localhost:8100/customers erstellen können:The following code example shows how to create an HTTP GET request message that is addressed to http://localhost:8100/customers.

Message request = Message.CreateMessage( MessageVersion.None, String.Empty );  
request.Headers.To = "http://localhost:8100/customers";  

HttpRequestMessageProperty property = new HttpRequestMessageProperty();  
property.Method = "GET";  
property.SuppressEntityBody = true;  
request.Properties.Add( HttpRequestMessageProperty.Name, property );  

Zuerst wird die leere Anforderung Message durch Aufruf von CreateMessage(MessageVersion, String) erstellt.First, an empty request Message is created by calling CreateMessage(MessageVersion, String). Der None-Parameter zeigt an, dass kein SOAP-Envelope erforderlich ist. Der Empty-Parameter wird als Aktion übergeben.The None parameter is used to indicate that a SOAP envelope is not required and Empty parameter is passed as the Action. Anschließend wird die Adresse für die Anforderungsnachricht angegeben, indem im To-Header der gewünschte URI festgelegt wird.The request message is then addressed by setting To header to the desired URI. Dann wird eine HttpRequestMessageProperty erstellt. Method wird auf die HTTP GET-Methode festgelegt, und für SuppressEntityBody wird der Wert true festgelegt, um anzuzeigen, dass keine Daten im Text der ausgehenden HTTP-Anforderungsnachricht gesendet werden sollen.Next, an HttpRequestMessageProperty is created and the Method is set to the HTTP verb GET method and the SuppressEntityBody is set to true to indicate that no data should be sent in the body of the outgoing HTTP request message. Anschließend wird noch die Anforderungseigenschaft zur Properties-Auflistung der Anforderungsnachricht hinzugefügt, damit gesteuert werden kann, auf welche Weise der HTTP-Transport die Anforderung sendet.Finally, the request property is added to the Properties collection of the request message so it can influence how the HTTP Transport sends the request. Die Nachricht kann nun über eine geeignete Instanz von IRequestChannel gesendet werden.The message is then ready to be sent over an appropriate instance of the IRequestChannel.

Auf ähnliche Weise kann beim Dienst die HttpRequestMessageProperty aus der eingehenden Nachricht extrahiert und eine Antwort erstellt werden.Similar techniques can be used on the service to extract the HttpRequestMessageProperty from an incoming message and construct a response.