Pergunta

Veja também Como um servidor WCF informa um cliente WCF sobre alterações?(Melhor solução do que uma pesquisa simples, por exemploComentário ou enquete longa)

Preciso usar tecnologia push com WCF por meio de firewalls de cliente.Este deve ser um problema comum, e eu sei que funciona em teoria (veja os links abaixo), mas não consegui fazê-lo funcionar e não consegui encontrar um exemplo de código que o demonstre.

Requisitos:

  • WCF
  • Os clientes se conectam ao servidor através da porta tcp 80 (netTcpBinding).
  • O servidor envia informações em intervalos irregulares (1 minuto a várias horas).
  • Os usuários não deveriam ter que configurar seus firewalls, os pushes do servidor devem passar por firewalls que tenham todas as portas de entrada fechadas.Para isso, é necessário TCP duplex na mesma conexão; uma ligação dupla não funciona, pois uma porta deve ser aberta no firewall do cliente.
  • Os clientes enviam pulsações ao servidor em intervalos regulares (talvez a cada 15 minutos) para que o servidor saiba que o cliente ainda está ativo.
  • O servidor é IIS7 com WAS.

A solução parece ser netTcpBinding duplex.Com base nesta informação:

WCF através de firewalls e NATs

Mantendo conexões abertas no IIS

Mas ainda não encontrei um exemplo de código que funcione.Tentei combinar os exemplos "Duplex" e "TcpActivation" dos exemplos WCF da Microsoft sem sorte.Alguém pode me indicar um exemplo de código que funcione ou criar um pequeno aplicativo de exemplo.Muito obrigado!

Foi útil?

Solução

Encontrei algumas soluções:

Gelo ZeroC GPL com opção comercial.Só testei rapidamente.Parece mais poderoso que o .NET Remoting e é desenvolvido de forma muito ativa.

RemObjects O desenvolvimento comercial e ativo suporta tudo, mas não parece ter todos os recursos mais avançados que o GenuineChannels usa.

Canais Genuínos.Ele usa comunicação remota com muitos recursos adicionais interessantes, sendo o mais importante que funciona através de NATs sem a necessidade de abrir o firewall do cliente.Infelizmente parece estar muito morto.

Outra solução é usar streaming com IIS, conforme este artigo: Mantendo conexões abertas no IIS

O cliente faz a primeira conexão (http com IIS6, tcp com IIS7) ao servidor na porta 80, a conexão é então mantida aberta com uma resposta de streaming que nunca termina.

Não tive tempo de experimentar isso e não encontrei um exemplo que diga que resolve especificamente o problema do firewall, mas aqui está um excelente exemplo que provavelmente funciona: Fluxo de XML.

Outras dicas

Você já tentou olhar: http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

Você pode fornecer exemplos do que já tentou?Com detalhes de firewalls etc, mensagens de erro?

Se o cliente e o servidor puderem ser endereçados diretamente e os firewalls não forem um problema, você já pensou em permitir que os clientes registrem uma URL fornecendo um contrato compatível?O servidor pode então chamar esse serviço sempre que necessário, sem a necessidade de estabelecer uma conexão de longa duração (mas principalmente ociosa), evitando a necessidade de batimentos cardíacos e pode se tornar resiliente entre sessões/conexões.

Na maioria das configurações de firewall, a conexão TCP será interrompida pelo firewall se estiver ociosa para conservar recursos.O tempo limite de inatividade provavelmente não é algo que você possa controlar.Alguns irão derrubá-los se estiverem ociosos e o limite de recursos for atingido.

A maioria dos ambientes corporativos não permite que nenhuma máquina faça uma conexão TCP de saída.

Além disso, usar esse mecanismo significa que você terá problemas de dimensionamento.Acho que a solução mais confiável é colocar as informações na fila e fazer com que seus clientes as pesquisem regularmente.Utilize o cache, se possível, de modo que uma pesquisa de cliente subsequente obtenha os dados armazenados em cache do cache do proxy do cliente, se eles estiverem usando um.

Se você tiver que enviar dados em tempo hábil, em menos de um segundo (ou seja,serviços financeiros), então considere alguma infraestrutura de mensagens, como um distribuidor NServiceBus no lado do cliente, mas isso exigirá a instalação do cliente...

Então você já tentou usar o Toredo?Depois de ler que apareceria lá, provavelmente é muito complicado para um usuário configurar.

Eu não tentei o cenário de que você fala, então não posso ajudar muito, desculpe.Se tudo que você precisa ignorar é o firewall do cliente, você pode querer verificar esta postagem.

Boa sorte.

Você já tentou este?Ligação DuplexHttp

Ele está usando uma técnica de pesquisa inteligente encapsulada como ligação WCF personalizada.Portanto, deve funcionar imediatamente.

Você pode fazer as seguintes alterações no cliente para acessar o serviço web duplex no cliente habilitado para Firewall.

  • Defina a opção WebHttp marcada em Firewall -> Avançado -> Configurações (de configuração de conexão de rede) -> Servidor Web (Http)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top