Como fazer / simular conexão TCP persistente?

Parece que as conexões TCP do WCF não são persistentes. A primeira resposta de ping demora um pouco, mas os processos subsequentes levam menos tempo. Depois de um tempo, demora muito outra vez – outra re-conexão?

SERVER> Iniciado em net.tcp: //0.0.0.0: 999

CLIENTE> Conexão criada para net.tcp: // localhost: 999 // Não é uma conexão real, pronta para conexão

CLIENTE> Resposta de ping em 1s163ms // Primeira conexão

CLIENTE> Resposta de ping em 22 ms // Já conectado

CLIENTE> Resposta de Ping em 26ms

CLIENTE> Resposta Ping em 24ms

CLIENTE> Resposta de ping em 325 ms // Re-connected

CLIENTE> Resposta de Ping em 19ms

CLIENTE> Ping reply em 767ms // Re-connected

Se for verdade, qual é o valor de tempo ocioso para uma conexão tcp antes de ser desconectado? Eu preciso manter a conexão viva.

Atualize o código modificado:

NetTcpBinding tcpBind = new NetTcpBinding(); tcpBind.ReliableSession.Enabled = true; tcpBind.ReliableSession.Ordered = true; tcpBind.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10); ServiceHost svh = new ServiceHost(typeof(ServiceImplementation)); svh.AddServiceEndpoint( typeof(WCFSimple.Contract.IService), //new NetTcpBinding(), tcpBind, String.Format("net.tcp://{0}:{1}", ip, port)); svh.Open(); 

Agora eu recebi outro erro:

A ação http://tempuri.org/IService/Pong não é suportada por este terminal. Apenas as mensagens WS-ReliableMessaging de fevereiro de 2005 são processadas por esse terminal.

Atualização Eu modifiquei apenas o lado do servidor e isso causou o erro. Em seguida, modifiquei o TCP do lado do cliente como uma mensagem confiável.

Eu não acho que o Ping é uma boa ferramenta para testar uma conexão TCP. Porque o Ping usa o ICMP como seu protocolo subjacente em vez do TCP.

Eu sugiro que você crie um cliente WCF, conecte-se ao serviço e, em seguida, verifique a conexão TCP através de algumas ferramentas de sniffering de rede ou simplesmente use netstat para verificação rápida.

Normalmente, as conexões do WCF são transitórias, embora haja algum conjunto de conexões que ocorre em segundo plano.

Usando net.tcp como o transporte, conexões persistentes (longo prazo) são possíveis. O código que você postou é uma maneira de conseguir isso.

Para obter mais informações e algumas alternativas, confira o que você precisa saber sobre chamadas de uma via, retornos de chamada e events , um artigo da revista MSDN de outubro de 2006.

Também de uso são as propriedades IsInitiating e IsTerminating disponíveis no atributo OperationContract .