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.
En esta sección se describe el protocolo de intercambio de contexto introducido en la versión de .NET Framework versión 3.5 de Windows Communication Foundation (WCF). Este protocolo permite al canal de cliente aceptar un contexto proporcionado por un servicio y aplicarlo a todas las solicitudes posteriores a ese servicio enviados a través de la misma instancia del canal de cliente. La implementación del protocolo de intercambio de contexto puede usar uno de los dos mecanismos siguientes para propagar el contexto entre el servidor y el cliente: cookies HTTP o un encabezado SOAP.
El protocolo de intercambio de contexto se implementa en una capa de canal personalizada. El canal comunica el contexto hacia y desde la capa de aplicación mediante una ContextMessageProperty propiedad . Para la transmisión entre extremos, el valor del contexto se serializa como un encabezado SOAP en la capa de canal o convertido a o desde las propiedades de mensaje que representan una solicitud y respuesta HTTP. En este último caso, se espera que una de las capas de canal subyacente convierta las propiedades de mensaje de solicitud y respuesta HTTP a y desde cookies HTTP, respectivamente. La elección del mecanismo utilizado para intercambiar el contexto se realiza mediante la ContextExchangeMechanism propiedad en .ContextBindingElement Los valores válidos son HttpCookie y SoapHeader.
En el cliente, una instancia de un canal puede funcionar en dos modos en función de la configuración de la propiedad channel, Enabled.
Modo 1: Administración del contexto del canal
Este es el modo predeterminado donde Enabled se establece en true. En este modo, el canal de contexto administra el contexto y almacena en caché el contexto durante su vigencia. El contexto se puede recuperar del canal a través de la propiedad IContextManager llamando al método GetContext. El canal también se puede inicializar previamente con un contexto específico antes de abrirse, llamando al método SetContext en la propiedad del canal. Una vez que el canal se inicializa con el contexto, no se puede restablecer.
A continuación se muestra una lista de invariables en este modo:
Cualquier intento de restablecer el contexto mediante
SetContextdespués de abrir el canal produce una InvalidOperationException.Cualquier intento de enviar el contexto utilizando la ContextMessageProperty en un mensaje saliente inicia una InvalidOperationException.
Si se recibe un mensaje del servidor con un contexto específico, cuando el canal ya se ha inicializado con un contexto específico, esto da como resultado un ProtocolException.
Nota:
Es adecuado recibir un contexto inicial del servidor solo si el canal se abre sin ningún contexto establecido explícitamente.
ContextMessageProperty en un mensaje entrante siempre es null.
Modo 2: Administración del contexto de la aplicación
Este es el modo cuando Enabled se establece en false. En este modo, el canal de contexto no administra el contexto. Es responsabilidad de la aplicación recuperar, administrar y aplicar el contexto mediante el uso de ContextMessageProperty. Cualquier intento de llamar GetContext a o SetContext da como resultado un InvalidOperationException.
Independientemente del modo elegido, el generador de canales de cliente admite patrones de intercambio de mensajes IRequestChannel, IRequestSessionChannel y IDuplexSessionChannel.
En el servicio, una instancia del canal es responsable de convertir el contexto proporcionado por el cliente en los mensajes entrantes a ContextMessageProperty. A continuación, el nivel de aplicación u otros canales pueden tener acceso a la propiedad de mensaje más arriba en la pila de llamadas. Los canales de servicio también permiten que la capa de aplicación especifique un nuevo valor de contexto que se va a propagar al cliente mediante la asociación de un ContextMessageProperty al mensaje de respuesta. Esta propiedad se convierte en el encabezado SOAP o la cookie HTTP que contiene el contexto, que depende de la configuración del enlace. El agente de escucha del canal de servicio admite IReplyChannel, IReplySessionChannel, y IReplySessionChannel patrones de intercambio de mensajes.
El protocolo de intercambio de contexto introduce un nuevo wsc:Context encabezado SOAP para representar la información de contexto cuando no se usan cookies HTTP para propagar el contexto. El esquema de encabezado de contexto permite cualquier número de elementos secundarios, cada uno con una clave de texto y contenido de texto. A continuación se muestra un ejemplo de un encabezado de contexto.
<Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">
<property name="myContext">context-2</property>
</Context>
Cuando está en modo HttpCookie, las cookies se establecen usando el encabezado SetCookie. El nombre de la cookie es WscContext. El valor de la cookie es la codificación Base64 del wsc:Context encabezado. Este valor se incluye entre comillas.
El valor del contexto debe protegerse de la modificación mientras está en tránsito por el mismo motivo por el que se protegen los encabezados WS-Addressing: el encabezado se usa para determinar dónde dirigir la solicitud en el servicio. Por lo tanto, el wsc:Context encabezado debe estar firmado digitalmente o firmado y cifrado en el nivel de SOAP o del transporte cuando la vinculación ofrece capacidad de protección de mensajes. Cuando se usan cookies HTTP para propagar el contexto, deben protegerse mediante la seguridad de transporte.
Los puntos de conexión de servicio que requieren compatibilidad con el protocolo de intercambio de contexto pueden hacer que sea explícito en la directiva publicada. Se han introducido dos nuevas aserciones de directiva para representar el requisito de que el cliente admita el protocolo de intercambio de contexto en el nivel SOAP o para habilitar la compatibilidad con cookies HTTP. La generación de estas aserciones en la directiva sobre el servicio se controla mediante el valor de la propiedad ContextExchangeMechanism de la siguiente manera.
Para ContextSoapHeader, se genera la siguiente aserción:
<IncludeContext xmlns="http://schemas.microsoft.com/ws/2006/05/context" protectionLevel="Sign" />Para HttpCookie, se genera la siguiente aserción:
<HttpUseCookie xmlns="http://schemas.xmlsoap.org/soap/http"/>