Compartilhar via


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"/>  
    

Confira também