Cuidados ao utilizar o WSDualHttpBinding


Há algum tempo eu escrevi um artigo que fala sobre a possibilidade que temos para efetuar callbacks do serviço para o cliente que, em outras palavras, significa o serviço se comunicando com o cliente, permitindo ao mesmo notificar sobre o término de alguma tarefa, simular eventos, etc. Esse tipo de comunicação é também referida/conhecida com “duplex”.

Quando queremos esta funcionalidade e o serviço está exposto via TCP, através do binding NetTcpBinding, o WCF utiliza o mesmo canal para efetuar a comunicação entre o serviço e o cliente. Já quando o serviço for exposto através do protocolo HTTP, utilizamos o binding WSDualHttpBinding, responsável por possibilitar callbacks através do HTTP. Como o HTTP é um protocolo unidirecional, esse binding é responsável por também criar um endpoint do lado do cliente (diferente do usado para envio das mensagens), que receberá os callbacks que o serviço enviará.

Enquanto você trabalha no desenvolvimento do serviço/cliente, que na maioria das vezes é na máquina local, tudo funciona perfeitamente. Alguns problemas começam a aparecer quando você faz a distribuição dos aplicativos que consomem o serviço via HTTP. O primeiro deles é quando você instala o serviço em uma máquina com Windows XP e que tenha o IIS instalado (que não tem o HTTP.sys). A ausência do HTTP.sys não permite ao Windows compartilhar uma mesma porta entre múltiplas aplicações. Por padrão, o WSDualHttpBinding irá criar e configurar o endpoint com a porta 80, ou seja, a mesma utilizada pelo IIS, resultando em uma exceção do tipo AddressAlreadyInUseException. Você pode facilmente resolver isso removendo ou parando o serviço do IIS ou especificando uma outra porta. Para utilizar uma porta diferente, basta utilizar o atributo clientBaseAddress (elemento binding) na configuração do binding do lado do cliente.

Já o segundo problema está relacionado a solução do primeiro. Se você altera a porta padrão, muito provavelmente ela estará barrada no firewall do Windows. Isso quer dizer que se o firewall estiver ativo (que é o recomendado), o serviço não conseguirá enviar o callback para o cliente. Para resolver isso, você pode adicionar uma exceção no firewall do Windows. Você pode fazer isso diretamente através do gerenciador do firewall no Painel de Controle, ou até mesmo via programação.

Anúncios

Deixe uma resposta

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

Logotipo do WordPress.com

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

Imagem do Twitter

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

Foto do Facebook

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

Foto do Google+

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

Conectando a %s