Assim como o COM+ e o ASP.NET, o WCF também disponibiliza uma classe com membros que trazem informações contextuais, ou seja, a respeito da requisição corrente. Essa classe chama-se OperationContext. O runtime do WCF cria e disponibiliza através da propriedade estática Current, a instância desta classe representando as informações referentes a requisição atual, podendo ser utilizada do lado do serviço como no cliente.
Essa classe é utilizada em grande parte do WCF, tanto pela sua própria infraestrutura como pelo desenvolvedor que cria o serviço ou o cliente. Grande parte dessas propriedades já foram abordados por aqui, mas em momentos específicos. No artigo de segurança, foi falado sobre a propriedade ServiceSecurityContext, que retorna um objeto com o mesmo nome, representando o contexto de segurança do cliente (podendo ser o serviço ou o cliente (proxy)).
Outra propriedade importante que essa classe expõe é a SessionId. Essa propriedade retorna uma GUID que identifica a sessão atual, que é útil para correlação de mensagens, logs, etc. Para mais informações sobre sessões do WCF, consulte este artigo. Há também uma propriedade chamada Host, que como o próprio nome diz, retorna a instância da classe ServiceHostBase que hospeda e gerencia a execução do serviço.
Temos também quatro propriedades nesta classe que trabalham com headers e properties: IncomingMessageHeaders, IncomingMessageProperties, OutgoingMessageHeaders e OutgoingMessageProperties. Como utilizá-la e para entender a direferença entre esses dois tipos, consulte este artigo.
Recentemente também falei aqui sobre extensibilidade de uma mensagem. Como a classe OperationContext também implementa a interface IExtensibleObject<T>, definindo o tipo T como OperationContext, é possível adicionarmos à ela extensões com um tempo de vida mais curto, “vivendo” apenas durante a execução da requisição corrente.
A propriedade InstanceContext, fornece informações a respeito da instância da classe que representa o serviço, ou seja, aquela classe onde implementamos o contrato e a definimos no construtor do ServiceHost. Temos também a propriedade RequestContext, que expoõe a instância da classe RequestContext. Esta classe é a relação entre a mensagem da requisição e a mensagem da resposta. Esta propriedade pode ser nula quando estiver trabalhando com operações do tipo one-way.
Para finalizar, temos dois métodos: SetTransactionComplete e GetCallbackChannel<T>. O primeiro método é responsável por efetuar o commit de uma transação (caso ela exista). Para maiores informações sobre como utilizá-lo, consulte este artigo, que aborda como funcionam as transações dentro de serviços WCF. O método GetCallbackChannel<T> é responsável por estabelecer a comunicação entre o serviço e o cliente, utilizando contratos de callback.