Pergunta

Preciso de ajuda para resolver um problema que estou enfrentando com a comunicação de um cliente de desktop com o serviço WCF hospedado no IIS.

O que estou tentando fazer no meu caso de teste:

  1. O servidor hospeda um serviço wsdualhttpbinding
  2. O cliente estabelece uma conexão (o método de registro de chamadas), fornecendo seu URI de retorno de chamada que contém o endereço IP do cliente
  3. Depois que a conexão é estabelecida, uma página da web é iniciada pelo aplicativo cliente. O usuário digita algum texto na caixa de texto e cliques em envio. A página da web envia o texto para todos os clientes de desktop registrados.

Questão:

Na etapa 2, um PC pode ter vários endereços IP (adaptador Ethernet, adaptadores de loopback etc). Se durante a chamada de registro, um IP desta lista será enviado no URL de retorno de chamada que não pode ser chamado de volta do servidor (por exemplo, IP do adaptador de loopback), uma exceção de tempo limite será lançada. Após algumas dessas tentativas, o servidor não pode mais aceitar chamadas dos clientes (seja IP válido ou não). Às vezes, a exceção do "servidor demais" era lançada.

(Não posso usar o nome totalmente qualificado da Machine no URI de retorno de chamada devido a problemas de configuração DNS/WINS, fazendo com que o servidor não resolva o nome da máquina no endereço IP correto).

Como reproduzir:
uma. Publique o servidor no IIS. De uma máquina diferente com vários endereços IP, execute o cliente. O cliente lança exceções de tempo limite e saídas do programa após 3 tentativas b. Um parâmetro no app.config permite digitar o endereço IP certo (IP a usar). Agora, se o programa for lançado, tudo funcionará bem.
c. Se eu remover este endereço IP especificado acima para que um IP incorreto seja usado, novamente a etapa A acontece. Execute os programas 2-3 vezes neste modo.
d. Faça alterações como na etapa B e execute o programa. Às vezes eu recebo uma exceção de tempo limite. Outras vezes, o site surge. No entanto, quando o texto é inserido e enviado, ele não chega ao cliente. (O método do registro funcionou, embora o serviço da Web não tenha recebido nenhuma chamada. O envio da função falha, pois não há clientes registrados no serviço da web.

Não sei por que exatamente isso acontece e como resolvê -lo. Aqui está minha solução Visual Studio - http://bit.ly/atkfos

Agradeço altamente quaisquer insumos, comentários. Ambiente: Servidor - Windows XP (IIS 5), Windows Server 2008 SP2 X64 (IIS 7), Cliente: Windows XP

Obrigado gc

Foi útil?

Solução

Bem, acho que o principal problema é o seguinte: quando o servidor tenta ligar de volta ao cliente e falha, o canal entre os dois se tornará "falhado" e tornou -se inútil.

Depois que esse evento acontece, você deve descartar o proxy do lado do cliente e recriá -lo - ou lidar com o tempo limite graciosamente no servidor (pegue -o, transformá -lo em uma falha de sabão, registre -o - seja o que for - apenas não deixe o Não filtrado .NET TimeoutException Passe de volta para o cliente, isso irá culpar o canal).

O que você faz do lado do servidor quando essa timeoutException acontece? Você se certifica de não borbulhar essa exceção até o canal?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top