Protocolo de troca de contexto
Esta seção descreve o protocolo de troca de contexto introduzido no Windows Communication Foundation (WCF) versão .NET Framework versão 3.5. Esse protocolo permite que o canal do cliente aceite um contexto fornecido por um serviço e o aplique a todas as solicitações subsequentes a esse serviço enviadas pela mesma instância do canal do 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 de aplicativo usando uma ContextMessageProperty propriedade. Para transmissão entre pontos de extremidade, o valor do contexto é serializado como um cabeçalho SOAP na camada de canal ou convertido para ou a partir das propriedades da mensagem que representam uma solicitação e resposta HTTP. Neste último caso, espera-se que uma das camadas de canal subjacentes converta as propriedades da solicitação HTTP e da mensagem de resposta de e para cookies HTTP, respectivamente. A escolha do mecanismo usado para trocar o contexto é feita usando a ContextExchangeMechanism propriedade no ContextBindingElement. Os valores válidos são HttpCookie
ou SoapHeader
.
No 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
Este é o modo padrão onde 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 através da propriedade IContextManager
channel chamando o GetContext
método. O canal também pode ser pré-inicializado com contexto específico antes de ser aberto chamando o SetContext
método na propriedade channel. Uma vez que o canal é inicializado com contexto, ele não pode ser redefinido.
Segue-se uma lista de invariantes neste modo:
Qualquer tentativa de redefinir o contexto usando
SetContext
depois que o canal foi aberto lança um InvalidOperationExceptionarquivo .Qualquer tentativa de enviar contexto usando o ContextMessageProperty em uma mensagem de saída lança um InvalidOperationExceptionarquivo .
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 um ProtocolExceptionarquivo .
Nota
É apropriado receber um contexto inicial do servidor somente se o canal for aberto sem qualquer contexto definido explicitamente.
A ContextMessageProperty mensagem de entrada é sempre nula.
Modo 2: Gerenciamento de contexto de aplicativo
Este é o modo quando Enabled está definido como false
. Neste modo, o canal de contexto não gerencia o contexto. É responsabilidade do aplicativo recuperar, gerenciar e aplicar o contexto usando o ContextMessageProperty. Qualquer tentativa de chamada GetContext
ou SetContext
resulta em um InvalidOperationExceptionarquivo .
Não importa qual modo seja escolhido, a fábrica de canais do cliente suporta IRequestChannel, IRequestSessionChannele padrões IDuplexSessionChannel de troca de mensagens.
No serviço, uma instância do canal é responsável por converter o contexto fornecido pelo cliente nas mensagens recebidas para o ContextMessageProperty. A propriedade message pode então ser acessada pela camada de 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 de volta ao cliente anexando um ContextMessageProperty à mensagem de resposta. Esta propriedade é convertida para o cabeçalho SOAP ou cookie HTTP que contém o contexto, que depende da configuração da ligação. O ouvinte do canal de serviço suporta IReplyChannel, IReplySessionChannele padrões IReplySessionChannel de troca de mensagens.
O protocolo de troca de contexto introduz um novo wsc:Context
cabeçalho SOAP para representar as informações de contexto quando os 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-se 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 no HttpCookie
modo, os cookies são definidos usando o SetCookie
cabeçalho. O nome do cookie é WscContext
. O valor do cookie é a codificação Base64 do wsc:Context
cabeçalho. Este valor está entre aspas.
O valor do contexto deve ser protegido contra modificações durante o trânsito pelo mesmo motivo pelo qual os cabeçalhos WS-Addressing são protegidos – o cabeçalho é usado para determinar para onde enviar a solicitação no serviço. Portanto wsc:Context
, o cabeçalho deve ser assinado digitalmente ou assinado e criptografado no nível SOAP ou de transporte quando a associação oferece capacidade de proteção de mensagem. Quando os cookies HTTP são usados para propagar o contexto, eles devem ser protegidos usando segurança de 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 asserções de política foram introduzidas para representar o requisito para que o cliente ofereça suporte ao protocolo de troca de contexto no nível SOAP ou para habilitar o suporte a cookies HTTP. A geração dessas afirmações na política sobre o serviço é controlada pelo valor do ContextExchangeMechanism imóvel da seguinte forma:
Para ContextSoapHeader, a seguinte asserção é gerada:
<IncludeContext xmlns="http://schemas.microsoft.com/ws/2006/05/context" protectionLevel="Sign" />
Para HttpCookie, a seguinte asserção é gerada:
<HttpUseCookie xmlns="http://schemas.xmlsoap.org/soap/http"/>