Interoperabilidade com aplicativos POX
Os aplicativos POX ("Plain Old XML") se comunicam trocando mensagens HTTP brutas que contêm apenas dados de aplicativo XML que não estão incluídos em um envelope SOAP. O WCF (Windows Communication Foundation) 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 do WCF pode ser usado para implementar clientes que se comunicam com serviços baseados em POX.
Observação
Este documento foi originalmente escrito para .NET Framework 3.0. .NET Framework 3.5 tem suporte interno para trabalhar com aplicativos POX. Para obter mais informações sobre como ver o Modelo de programação Web HTTP do WCF.
Programação POX com o WCF
Os serviços do WCF que se comunicam por HTTP usando mensagens POX empregam um <customBinding>.
<customBinding>
<binding name="poxServerBinding">
<textMessageEncoding messageVersion="None" />
<httpTransport />
</binding>
</customBinding>
Essa associação personalizada contém dois elementos:
O codificador de mensagem de texto WCF padrão é configurado especialmente para usar o valor None, que permite a ele processar cargas de mensagem XML que não chegam encapsuladas em um envelope SOAP.
Os clientes do WCF que se comunicam por HTTP usando mensagens POX adotam uma associaçã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 as URIs para as quais enviam mensagens, eles geralmente devem configurar o HttpTransportBindingElement para o modo de endereçamento manual definindo a propriedade ManualAddressing como true
no elemento. Isso permite que as mensagens sejam tratadas explicitamente pelo código do aplicativo e não é necessário criar um 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 de protocolo importantes, 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 do 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 eventuais cabeçalhos de resposta HTTP.
O exemplo de código a seguir mostra como criar uma mensagem de solicitação HTTP GET endereçada a 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 vazia Message é criada chamando CreateMessage(MessageVersion, String). O parâmetro None é usado para indicar que um envelope SOAP não é necessário e o parâmetro Empty é passado como a Ação. A mensagem de solicitação é endereçada definindo o cabeçalho To para o URI desejado. Em seguida, um HttpRequestMessageProperty é criado e o Method é definido como o método GET do verbo HTTP e SuppressEntityBody é definido como true
indicar que nenhum dado deve ser enviado no corpo da mensagem de solicitação HTTP de saída. Por fim, a propriedade de solicitação é adicionada à coleção Properties da mensagem de solicitação para que ela possa influenciar como o Transporte HTTP envia a solicitação. Em seguida, a mensagem está pronta para ser enviada por uma instância apropriada de IRequestChannel.
Técnicas semelhantes podem ser usadas no serviço para extrair HttpRequestMessageProperty de uma mensagem de entrada e construir uma resposta.