Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Esta seção descreve o protocolo de troca de contexto introduzido no WCF (Windows Communication Foundation) versão 3.5 do .NET Framework. Esse protocolo permite que o canal 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 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 do aplicativo usando uma ContextMessageProperty propriedade. 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 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
Esse é o modo padrão em que Enabled é 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 o contexto, ele não pode ser redefinido.
Veja a seguir uma lista de invariáveis neste modo:
Qualquer tentativa de redefinir o contexto usando
SetContextdepois que o canal for aberto gerará um InvalidOperationException.Qualquer tentativa de enviar contexto usando o ContextMessageProperty em uma mensagem de saída lança um 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 que nenhum contexto seja definido explicitamente.
O ContextMessageProperty na mensagem de entrada é sempre nulo.
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 o contexto usando o ContextMessageProperty. Qualquer tentativa de chamar GetContext ou SetContext resulta em um 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. Em seguida, a propriedade da mensagem pode ser acessada pela camada do aplicativo ou por 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 um ContextMessageProperty à mensagem de resposta. Essa propriedade é convertida no cabeçalho SOAP ou cookie HTTP que contém o contexto, que depende da configuração da associação. O ouvinte do canal de serviço suporta os padrões de troca de mensagens IReplyChannel, IReplySessionChannel e IReplySessionChannel.
O protocolo de troca de contexto apresenta um novo wsc:Context cabeçalho SOAP 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. Veja a seguir 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>
No 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 wsc:Context cabeçalho. Esse valor está entre aspas.
O valor do contexto deve ser protegido contra modificação 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 expedir a solicitação no serviço. Portanto, o cabeçalho wsc:Context 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 mensagens. Quando cookies HTTP são usados para propagar o contexto, eles devem ser protegidos usando a segurança de transporte.
Os pontos de extremidade de serviço que necessitam de suporte para o protocolo de troca de contexto podem explicitá-lo na política publicada. Duas novas declarações de política foram introduzidas para representar o requisito para que o cliente dê suporte 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 do serviço é controlada pelo valor da propriedade ContextExchangeMechanism da seguinte maneira:
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"/>