Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os aplicativos "XML Antigo Simples" (POX) 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 finais 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 o .NET Framework 3.0. O .NET Framework 3.5 tem suporte interno para trabalhar com aplicativos POX. Para obter mais informações, consulte o modelo de programação HTTP da Web do WCF.
Programação POX com 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 padrão de mensagem de texto do WCF é configurado especialmente para usar o valor None, que permite processar cargas de mensagem XML que não chegam envolvidas em um envelope SOAP.
Os clientes do WCF que se comunicam por HTTP usando mensagens POX usam 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 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 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 de 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 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 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 é 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 o SuppressEntityBody é definido como true para 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 à Properties coleção da mensagem de solicitação para que possa influenciar como o Transporte HTTP envia a solicitação. Em seguida, a mensagem está pronta para ser enviada por uma instância apropriada do IRequestChannel.
Técnicas semelhantes podem ser usadas no serviço para extrair o HttpRequestMessageProperty de uma mensagem de entrada e construir uma resposta.