Dela via


Samverkan med POX-program

POX-program (Plain Old XML) kommunicerar genom att utbyta råa HTTP-meddelanden som endast innehåller XML-programdata som inte omges av ett SOAP-kuvert. Windows Communication Foundation (WCF) kan tillhandahålla både tjänster och klienter som använder POX-meddelanden. I tjänsten kan WCF användas för att implementera tjänster som exponerar slutpunkter för klienter som webbläsare och skriptspråk som skickar och tar emot POX-meddelanden. På klienten kan WCF-programmeringsmodellen användas för att implementera klienter som kommunicerar med POX-baserade tjänster.

Kommentar

Det här dokumentet skrevs ursprungligen för .NET Framework 3.0. .NET Framework 3.5 har inbyggt stöd för att arbeta med POX-program. Mer information finns i WCF Web HTTP Programming Model.

POX-programmering med WCF

WCF-tjänster som kommunicerar via HTTP med POX-meddelanden använder en customBinding>.<

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

Den här anpassade bindningen innehåller två element:

Standardkodaren för WCF-textmeddelanden är särskilt konfigurerad för att använda None värdet, vilket gör att den kan bearbeta XML-meddelandenyttolaster som inte tas emot omslutna i ett SOAP-kuvert.

WCF-klienter som kommunicerar via HTTP med POX-meddelanden använder en liknande bindning (visas i följande imperativa kod).

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 } );
}

Eftersom POX-klienter uttryckligen måste ange de URI:er som de skickar meddelanden till, måste de vanligtvis konfigurera HttpTransportBindingElement till ett manuellt adresseringsläge genom att ange ManualAddressing egenskapen till true för elementet. Detta gör att meddelanden kan åtgärdas explicit med programkod och det är inte nödvändigt att skapa en ny ChannelFactory varje gång ett program skickar ett meddelande till en annan HTTP-URI.

Eftersom POX-meddelanden inte använder SOAP-huvuden för att förmedla viktig protokollinformation måste POX-klienter och -tjänster ofta manipulera delar av den underliggande HTTP-begäran som används för att skicka eller ta emot ett meddelande. HTTP-specifik protokollinformation som HTTP-huvuden och statuskoder visas i WCF-programmeringsmodellen via två klasser:

  • HttpRequestMessageProperty, som innehåller information om HTTP-begäran, till exempel HTTP-metoden och begärandehuvuden.

  • HttpResponseMessageProperty, som innehåller information om HTTP-svaret, till exempel HTTP-statuskod och statusbeskrivning, samt eventuella HTTP-svarshuvuden.

I följande kodexempel visas hur du skapar ett HTTP GET-begärandemeddelande som är adresserat till 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 );

Först skapas en tom begäran Message genom att anropa CreateMessage(MessageVersion, String). Parametern None används för att indikera att ett SOAP-kuvert inte krävs och Empty att parametern skickas som åtgärd. Begärandemeddelandet adresseras sedan genom att ange To huvudet till önskad URI. Därefter skapas en HttpRequestMessageProperty och Method är inställd på METODEN HTTP verb GET och SuppressEntityBody är inställd true på för att indikera att inga data ska skickas i brödtexten i det utgående HTTP-begärandemeddelandet. Slutligen läggs begärandeegenskapen till i Properties samlingen av begärandemeddelandet så att den kan påverka hur HTTP-transporten skickar begäran. Meddelandet är sedan redo att skickas via en lämplig instans av IRequestChannel.

Liknande tekniker kan användas i tjänsten för att extrahera HttpRequestMessageProperty från ett inkommande meddelande och konstruera ett svar.