SessionId diferente com TCP


Como já disse em diversos lugares, o WCF fornece o modelo de gerenciamento de instância chamado de PerSession. Neste modelo, haverá uma instância da classe que representa o serviço para cada instância do proxy do lado do cliente. Com isso, utilizamos a propriedade SessionId, que retornará um GUID representando a identificação da instância, para que o runtime do WCF consiga correlacionar as mensagens. O código abaixo ilustra como podemos proceder para visualizar esse “Id”:

//Serviço
Debug.WriteLine(OperationContext.Current.SessionId);

//Cliente
Debug.WriteLine(proxy.InnerChannel.SessionId);

Em princípio, ao executar esses códigos, eles teriam que retornar a mesma informação. Mas há situações em que isso não acontece. Quando definimos o modo de gerenciamento de instância do serviço como PerSession e habilitamos a funcionalidade de garantia de entrega (Reliable Messages), essa combinação é referida como Reliable Sessions.

Ao utilizar o protocolo TCP em conjunto com este recurso, o cliente somente poderá capturar o “Id” após a chamada para o primeiro método ou após abrir explicitamente o proxy, através do método Open, ações que efetivamente criarão a sessão. Do contrário, a propriedade SessionId do lado do cliente sempre retornará nulo. Agora, se utilizar TCP com o recurso de sessões confiáveis desabilitado (que é o padrão), o cliente poderá acessar a propriedade SessionId antes de fazer qualquer chamada para o serviço, mas obterá um “Id” diferente daquela do serviço. Apesar de diferentes, o WCF consegue internamente lidar com isso, e correlacionar as mensagens, mas você não pode garantir a igualdade dos “Ids” em ambos os lados.

Se estiver com esse problema, o que precisa fazer é habilitar isso tanto no serviço quanto no cliente. Se utilizar o modo imperativo, pode utilizar uma versão (overload) do construtor do binding NetTcpBinding, que recebe um valor boleano indicando se a Reliable Session está ou não habilitada. Já no modo declarativo, pode utilizar o atributo enabled do elemento reliableSession, definindo-o como True. Abaixo estão os exemplos:

[ Modo Imperativo ]
NetTcpBinding tcp = new NetTcpBinding(SecurityMode.None, true);

[ Modo Declarativo ]
<reliableSession enabled=”true” ordered=”false” inactivityTimeout=”00:10:00″ />

Publicidade

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s