Protocolo de intercâmbio de contexto
Esta seção descreve o protocolo de troca de contexto introduzido na versão do WCF (Windows Communication Foundation) .NET Framework versão 3.5. Esse protocolo permite que o canal do cliente aceite um contexto fornecido por um serviço e aplique-o a todas as solicitações subsequentes a esse serviço enviadas pela mesma instância do canal cliente. A implementação do protocolo de troca de contexto pode usar um dos dois mecanismos a seguir para propagar o contexto entre o servidor e o cliente: cookies HTTP ou um cabeçalho SOAP.
O protocolo de troca de contexto é implementado em uma camada de canal personalizada. O canal comunica o contexto de e para a camada do aplicativo usando uma propriedade ContextMessageProperty. Para transmissão entre pontos de extremidade, o valor do contexto é serializado como um cabeçalho SOAP na camada do canal ou convertido para ou das propriedades da mensagem que representam uma solicitação e resposta HTTP. No último caso, espera-se que uma das camadas de canal subjacente converta as propriedades de solicitação HTTP e de mensagem de resposta de e para cookies HTTP, respectivamente. A escolha do mecanismo usado para troca do contexto é feita usando a propriedade ContextExchangeMechanism no ContextBindingElement. Os valores válidos são HttpCookie
ou SoapHeader
.
No lado cliente, uma instância de um canal pode operar em dois modos com base nas configurações na propriedade do canal, Enabled
Modo 1: Gerenciamento de Contexto de Canal
Esse é o modo padrão em que Enabled está definido como true
. Nesse modo, o canal de contexto gerencia o contexto e armazena em cache o contexto durante seu tempo de vida. O contexto pode ser recuperado do canal por meio da propriedade do canal IContextManager
, chamando o método GetContext
. O canal também pode ser pré-inicializado com contexto específico antes de ser aberto chamando o método SetContext
na propriedade do canal. Depois que o canal é inicializado com contexto, ele não pode ser redefinido.
Veja a seguir uma lista de invariáveis neste modo:
Qualquer tentativa de redefinir o contexto usando
SetContext
depois que o canal for aberto gera uma InvalidOperationException.Qualquer tentativa de enviar contexto usando a ContextMessageProperty em uma mensagem de saída gera uma InvalidOperationException.
Se uma mensagem for recebida do servidor com um contexto específico, quando o canal já tiver sido inicializado com um contexto específico, isso resultará em uma ProtocolException.
Observação
É apropriado receber um contexto inicial do servidor somente se o canal for aberto sem nenhum contexto definido explicitamente.
A ContextMessageProperty em mensagem de entrada é sempre nula.
Modo 2: Gerenciamento de Contexto do Aplicativo
Esse é o modo quando Enabled é definido como false
. Nesse modo, o canal de contexto não gerencia o contexto. É responsabilidade do aplicativo recuperar, gerenciar e aplicar contexto usando a ContextMessageProperty. Qualquer tentativa de chamar GetContext
ou SetContext
resulta em uma InvalidOperationException.
Não importa qual modo seja escolhido, a fábrica de canais do cliente dá suporte aos padrões de troca de mensagens do IRequestChannel, do IRequestSessionChannel e do IDuplexSessionChannel.
No serviço, uma instância do canal é responsável por converter o contexto fornecido pelo cliente em mensagens de entrada na ContextMessageProperty. A propriedade de mensagem pode então ser acessada pela camada do aplicativo ou outros canais mais acima na pilha de chamadas. Os canais de serviço também permitem que a camada de aplicativo especifique um novo valor de contexto a ser propagado novamente para o cliente anexando uma ContextMessageProperty à mensagem de resposta. Essa propriedade é convertida no cabeçalho SOAP ou cookie HTTP que contém o contexto, o que depende da configuração da associação. O ouvinte do canal de serviço dá suporte aos padrões de troca de mensagens do IReplyChannel, do IReplySessionChannel e do IReplySessionChannel.
O protocolo de troca de contexto apresenta um novo cabeçalho SOAP wsc:Context
para representar as informações de contexto quando cookies HTTP não são usados para propagar o contexto. O esquema de cabeçalho de contexto permite qualquer número de elementos filho, cada um com uma chave de cadeia de caracteres e conteúdo de cadeia de caracteres. Segue um exemplo de um cabeçalho de contexto:
<Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">
<property name="myContext">context-2</property>
</Context>
Quando em modo HttpCookie
, os cookies são definidos usando o cabeçalho SetCookie
. O nome do cookie é WscContext
. O valor do cookie é a codificação Base64 do cabeçalho wsc:Context
. Esse valor está entre aspas.
O valor do contexto deve ser protegido contra modificações enquanto estiver em trânsito pelo mesmo motivo que cabeçalhos WS-Addressing são protegidos – o cabeçalho é usado para determinar para onde enviar a solicitação no serviço. Portanto, exige-se que o cabeçalho wsc:Context
seja assinado digitalmente ou assinado e criptografado no nível SOAP ou de transporte quando a associação oferece a funcionalidade de proteção de mensagem. Quando cookies HTTP são usados para propagar contexto, eles devem ser protegidos usando a segurança do transporte.
Os pontos de extremidade de serviço que exigem suporte para o protocolo de troca de contexto podem torná-lo explícito na política publicada. Duas novas declarações de política foram introduzidas para representar o requisito de suporte dado pelo cliente ao protocolo de troca de contexto no nível SOAP ou para habilitar o suporte a cookie HTTP. A geração dessas declarações na política no serviço é controlada pelo valor da propriedade ContextExchangeMechanism da seguinte maneira:
Para ContextSoapHeader, a seguinte declaração é gerada:
<IncludeContext xmlns="http://schemas.microsoft.com/ws/2006/05/context" protectionLevel="Sign" />
Para HttpCookie, a seguinte declaração é gerada:
<HttpUseCookie xmlns="http://schemas.xmlsoap.org/soap/http"/>