Interoperabilidade com aplicações POX

Os aplicativos "Plain Old XML" (POX) se comunicam trocando mensagens HTTP brutas que contêm apenas dados de aplicativos XML que não estão incluídos em um envelope SOAP. Windows Communication Foundation (WCF) pode fornecer serviços e clientes que usam mensagens POX. No serviço, o WCF pode ser usado para implementar serviços que expõem pontos de extremidade a clientes, como navegadores da Web e linguagens de script que enviam e recebem mensagens POX. No cliente, o modelo de programação WCF pode ser usado para implementar clientes que se comunicam com serviços baseados em POX.

Nota

Este documento foi originalmente escrito para .NET Framework 3.0. O .NET Framework 3.5 tem suporte interno para trabalhar com aplicativos POX. Para obter mais informações sobre como consulte Modelo de programação WCF Web HTTP.

Programação POX com WCF

Os serviços WCF que se comunicam por HTTP usando mensagens POX usam um customBinding>.<

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

Esta ligação personalizada contém dois elementos:

O Codificador de Mensagens de Texto WCF padrão é especialmente configurado para usar o valor, o None que permite processar cargas úteis de mensagens XML que não chegam encapsuladas em um envelope SOAP.

Os clientes WCF que se comunicam por HTTP usando mensagens POX usam uma ligação semelhante (mostrada no código imperativo a seguir).

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

Como os clientes POX devem especificar explicitamente os URIs para os quais enviam mensagens, eles geralmente devem configurar o HttpTransportBindingElement para um modo de endereçamento manual definindo a ManualAddressing propriedade como true no elemento . Isso permite que as mensagens sejam endereçadas explicitamente pelo código do aplicativo e não é necessário criar um novo ChannelFactory sempre que um aplicativo envia uma mensagem para um URI HTTP diferente.

Como as mensagens POX não usam cabeçalhos SOAP para transmitir informações importantes do protocolo, os clientes e serviços POX geralmente devem manipular partes da solicitação HTTP subjacente usada para enviar ou receber uma mensagem. Informações de protocolo específicas de HTTP, como cabeçalhos HTTP e códigos de status, são exibidas no modelo de programação WCF por meio de duas classes:

  • HttpRequestMessageProperty, que contém informações sobre a solicitação HTTP, como o método HTTP e cabeçalhos de solicitação.

  • HttpResponseMessageProperty, que contém informações sobre a resposta HTTP, como o código de status HTTP e a descrição do status, bem como quaisquer cabeçalhos de resposta HTTP.

O exemplo de código a seguir mostra como criar uma mensagem de solicitação HTTP GET endereçada ao 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 );

Primeiro, uma solicitação Message vazia é criada chamando CreateMessage(MessageVersion, String). O None parâmetro é usado para indicar que um envelope SOAP não é necessário e Empty o parâmetro é passado como a Ação. A mensagem de solicitação é então endereçada definindo To o cabeçalho para o URI desejado. Em seguida, um HttpRequestMessageProperty é criado e o Method é definido como o método HTTP verb GET e o SuppressEntityBody é definido para true indicar que nenhum dado deve ser enviado no corpo da mensagem de solicitação HTTP de saída. Finalmente, a propriedade request é adicionada à Properties coleção da mensagem de solicitação para que possa influenciar como o Transporte HTTP envia a solicitação. A mensagem está então pronta para ser enviada através de uma instância apropriada do IRequestChannel.

Técnicas semelhantes podem ser usadas no serviço para extrair a HttpRequestMessageProperty mensagem de entrada e construir uma resposta.