Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Esta seção descreve o protocolo de troca de contexto introduzido na versão 3.5 do .NET Framework do Windows Communication Foundation (WCF). 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
chamando o método GetContext
. O canal pode ser pré-inicializado com um contexto específico antes de ser aberto, chamando o método SetContext
na propriedade do canal. 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
após a abertura do canal lança uma InvalidOperationExceptionexceção.Qualquer tentativa de enviar contexto usando o ContextMessageProperty numa mensagem de saída lança uma exceção 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 um ProtocolException.
Observação
É apropriado receber um contexto inicial do servidor somente se o canal for aberto sem qualquer contexto definido explicitamente.
O ContextMessageProperty na mensagem de entrada é sempre nulo.
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 ligar para GetContext
ou SetContext
resulta num InvalidOperationException.
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 padrões de troca de mensagens IReplyChannel, IReplySessionChannel, e IReplySessionChannel.
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 estiver no modo HttpCookie
, os cookies são definidos através do cabeçalho SetCookie
. 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 transporte pelo mesmo motivo pelo qual os cabeçalhos WS-Addressing são protegidos – o cabeçalho é usado para determinar para onde encaminhar a solicitação no serviço. Portanto, o cabeçalho wsc:Context
deve ser assinado digitalmente ou assinado e encriptado no nível SOAP ou de transporte quando a ligaçã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 explicitar isso 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 no serviço é controlada pelo valor da propriedade ContextExchangeMechanism 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"/>