Współdziałanie z aplikacjami POX

"Zwykłe stare aplikacje XML" (POX) komunikują się poprzez wymianę nieprzetworzonych komunikatów HTTP zawierających tylko dane aplikacji XML, które nie są ujęte w kopertę protokołu SOAP. Program Windows Communication Foundation (WCF) może udostępniać zarówno usługi, jak i klientów korzystających z komunikatów POX. W usłudze program WCF może służyć do implementowania usług, które uwidaczniają punkty końcowe dla klientów, takich jak przeglądarki internetowe i języki skryptowe, które wysyłają i odbierają komunikaty POX. Na kliencie model programowania WCF może służyć do implementowania klientów komunikujących się z usługami opartymi na protokole POX.

Uwaga

Ten dokument został pierwotnie napisany dla programu .NET Framework 3.0. Program .NET Framework 3.5 ma wbudowaną obsługę pracy z aplikacjami POX. Aby uzyskać więcej informacji na temat tego tematu, zobacz WCF Web HTTP Programming Model (Model programowania HTTP w sieci Web WCF).

Programowanie POX za pomocą programu WCF

Usługi WCF komunikujące się za pośrednictwem protokołu HTTP przy użyciu komunikatów POX używają niestandardowego <powiązania>.

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

To powiązanie niestandardowe zawiera dwa elementy:

Standardowy koder komunikatów tekstowych WCF jest specjalnie skonfigurowany do używania None wartości, co pozwala na przetwarzanie ładunków komunikatów XML, które nie docierają do koperty protokołu SOAP.

Klienci programu WCF komunikujący się za pośrednictwem protokołu HTTP przy użyciu komunikatów POX używają podobnego powiązania (pokazanego w poniższym kodzie imperatywnym).

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

Ponieważ klienci POX muszą jawnie określić identyfikatory URI, do których wysyłają komunikaty, zazwyczaj muszą skonfigurować HttpTransportBindingElement tryb ręcznego adresowania, ustawiając ManualAddressing właściwość na true wartość w elemecie . Umożliwia to jawne rozwiązanie komunikatów za pomocą kodu aplikacji i nie jest konieczne utworzenie nowego ChannelFactory za każdym razem, gdy aplikacja wysyła komunikat do innego identyfikatora URI HTTP.

Ponieważ komunikaty POX nie używają nagłówków PROTOKOŁU SOAP do przekazywania ważnych informacji o protokole, klienci i usługi POX często muszą manipulować elementami bazowego żądania HTTP używanego do wysyłania lub odbierania komunikatu. Informacje o protokole HTTP, takie jak nagłówki HTTP i kody stanu, są udostępniane w modelu programowania WCF za pomocą dwóch klas:

  • HttpRequestMessageProperty, który zawiera informacje o żądaniu HTTP, takie jak metoda HTTP i nagłówki żądań.

  • HttpResponseMessageProperty, który zawiera informacje o odpowiedzi HTTP, takie jak kod stanu HTTP i opis stanu, a także wszelkie nagłówki odpowiedzi HTTP.

Poniższy przykład kodu pokazuje, jak utworzyć komunikat żądania HTTP GET, który jest adresowany do 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 );

Najpierw jest tworzone puste żądanie Message przez wywołanie metody CreateMessage(MessageVersion, String). Parametr służy do wskazania, że koperta None protokołu SOAP nie jest wymagana, a Empty parametr jest przekazywany jako akcja. Komunikat żądania jest następnie rozwiązywany przez ustawienie To nagłówka żądanego identyfikatora URI. Następnie zostanie utworzony element HttpRequestMessageProperty , a Method właściwość jest ustawiona na metodę GET czasownika HTTP, a SuppressEntityBody właściwość jest ustawiona na true wartość wskazującą, że żadne dane nie powinny być wysyłane w treści wychodzącego komunikatu żądania HTTP. Na koniec właściwość żądania jest dodawana do Properties kolekcji komunikatu żądania, aby mieć wpływ na sposób wysyłania żądania przez transport HTTP. Wiadomość jest następnie gotowa do wysłania za pośrednictwem odpowiedniego wystąpienia klasy IRequestChannel.

Podobne techniki można użyć w usłudze, aby wyodrębnić HttpRequestMessageProperty element z przychodzącego komunikatu i utworzyć odpowiedź.