Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las aplicaciones "XML simple y antiguo" (POX) se comunican intercambiando mensajes HTTP sin procesar y que contienen únicamente datos de aplicación XML que no están envueltos en un sobre SOAP. Windows Communication Foundation (WCF) puede proporcionar servicios y clientes que usan mensajes POX. En el servicio, WCF se puede usar para implementar servicios que exponen puntos de conexión a clientes como exploradores web y lenguajes de scripting que envían y reciben mensajes POX. En el cliente, el modelo de programación WCF se puede usar para implementar clientes que se comunican con servicios basados en POX.
Nota:
Este documento se escribió originalmente para .NET Framework 3.0. .NET Framework 3.5 tiene compatibilidad integrada para trabajar con aplicaciones POX. Para más información, vea Modelo de programación web HTTP de WCF.
Programación de POX con WCF
Los servicios WCF que se comunican a través de HTTP mediante mensajes POX usan customBinding<>.
<customBinding>
<binding name="poxServerBinding">
<textMessageEncoding messageVersion="None" />
<httpTransport />
</binding>
</customBinding>
Este enlace personalizado contiene dos elementos:
El codificador de mensajes de texto WCF estándar está especialmente configurado para usar el None valor , lo que permite procesar cargas de mensajes XML que no llegan encapsuladas en un sobre SOAP.
Los clientes WCF que se comunican a través de HTTP mediante mensajes POX usan un enlace similar (que se muestra en el siguiente código imperativo).
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 } );
}
Dado que los clientes de POX deben especificar explícitamente los URI a los que envían mensajes, normalmente deben configurar HttpTransportBindingElement en un modo manual de direccionamiento estableciendo la propiedad ManualAddressing a true en el elemento. Esto permite que el código de aplicación solucione explícitamente los mensajes y no es necesario crear un nuevo ChannelFactory cada vez que una aplicación envía un mensaje a un URI HTTP diferente.
Dado que los mensajes POX no usan encabezados SOAP para transmitir información de protocolo importante, los clientes y servicios de POX a menudo deben manipular partes de la solicitud HTTP subyacente que se usa para enviar o recibir un mensaje. La información de protocolo específica de HTTP, como los encabezados HTTP y los códigos de estado, se muestran en el modelo de programación WCF a través de dos clases:
HttpRequestMessageProperty, que contiene información sobre la solicitud HTTP, como el método HTTP y los encabezados de solicitud.
HttpResponseMessageProperty, que contiene información sobre la respuesta HTTP, como el código de estado HTTP y la descripción del estado, así como los encabezados de respuesta HTTP.
En el ejemplo de código siguiente se muestra cómo crear un mensaje de solicitud HTTP GET dirigido 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 );
En primer lugar, se crea una solicitud Message vacía llamando a CreateMessage(MessageVersion, String). El None parámetro se usa para indicar que no se requiere un sobre SOAP y Empty que el parámetro se pasa como acción. El mensaje de solicitud se direcciona a continuación estableciendo el encabezad To en el URI deseado. A continuación, se crea un HttpRequestMessageProperty y se establece el Method en el método HTTP GET y se establece SuppressEntityBody en true para indicar que no se debe enviar ningún dato en el cuerpo del mensaje de solicitud HTTP saliente. Por último, la propiedad 'request' se agrega a la Properties colección del mensaje de solicitud para influir en la forma en que el transporte HTTP envía la solicitud. Después, el mensaje está listo para enviarse a través de una instancia adecuada de IRequestChannel.
Se pueden usar técnicas similares en el servicio para extraer el HttpRequestMessageProperty de un mensaje entrante y construir una respuesta.