WCF ¿No está saliendo correctamente?

Estoy teniendo un problema de tiempo de espera, estos son los detalles:

Mi configuración de enlace se ve así:

       

Estoy enviando un mensaje a un servidor que sé que está desactivado, por lo que la conexión debería expirar después de 3 segundos según lo estipulado en mi app.config, pero por algún motivo está demorando entre 20 y 30 segundos.

Cuando se lanza la EndPointNotFoundException, esta es la información que obtengo:

System.ServiceModel.EndPointNotFoundException: No se pudo conectar a net.tcp: //10.0.0.82: 4466 / MegaMatcherWcf. El bash de conexión duró un lapso de tiempo de 00:00:03. Código de error TCP 10060: un bash de conexión falló porque la parte conectada no respondió correctamente después de un período de tiempo, o falló la conexión establecida porque el host conectado no respondió 10.0.0.82:4466

Si trato la misma prueba con la máquina encendida, pero no hay un software de escucha en ejecución, obtengo el comportamiento esperado, y la conexión se agota luego de 3 segundos. ¿Por qué si la máquina está apagada toma 30 segundos y luego dime que tomó 3 segundos?

Creo que estás lidiando con un problema de tiempo de espera de Windows ahora, no con tu tiempo de espera de WCF. Windows tardará entre 20 y 30 segundos en determinar que una máquina no responde en la red. Cuando realiza su llamada al servidor WCF, Windows primero tiene que establecer una ruta al servidor. Cuando no puede, alerta su software y su software cree que llegó a su propio tiempo de espera. Su sistema nunca llega al punto de sondeo real para ver si el servicio se está ejecutando porque Windows todavía está tratando de encontrar algo en el otro extremo de esa dirección IP.

Para ser un poco más específico que @BiggsTRC (cuya respuesta es ampliamente correcta):

  • Los delegates de WCF a System.Net.Sockets clasifican los detalles para establecer la conexión de la capa de transporte en un canal NetTcpBinding;
  • System.Net.Sockets es una envoltura alrededor de la API de WINSOCK no administrada;
  • La API de WINSOCK tiene tiempos de espera predeterminados internos, pero no proporciona ningún mecanismo documentado para especificar un tiempo de espera en ciertas operaciones de locking, incluido WSAConnect() , que utiliza el método .NET Socket.Connect() ;
  • El código WCF (en System.ServiceModel.Channels.SocketConnectionInitiator.Connect() ) llama a Socket.Connect , y si esto Socket.Connect una excepción de ciertos tipos, verifica si hay algún tiempo restante en su período de tiempo de conexión. Si no lo hay, obtiene una EndpointNotFoundException con el mensaje de error que ha visto;
  • WCF utiliza una clase TimeoutHelper para realizar un seguimiento de los periodos de tiempo de espera y hacer la aritmética de tiempo. Esto tiene un método llamado ElapsedTime , pero es un nombre incorrecto ya que nunca devuelve un valor mayor que el período de tiempo de espera original: esa es la razón por la que el mensaje de error le informa sobre el tiempo que duró el bash de conexión.

WCF podría hacer cumplir sus tiempos de espera configurados utilizando los métodos asíncronos de la API de Sockets, monitoreando el tiempo de espera en un subproceso separado para el bash de conexión, pero actualmente no lo hace. Si cree que se trata de un error (lo que podría decirse que es), puede informarlo en el sitio de conexión de Microsoft y quizás solucionarlo en una futura versión o paquete de servicio.

Me enfrentaba al mismo problema

Hizo cada cosa, probó cada configuración, nada ayudó.

net.tcp a través de internet se está agotando como un infierno en procesos largos

Lo único que me ayudó fue cuando lo usé.

Patrón de intercambio de mensajes dúplex o de callback

https://msdn.microsoft.com/en-us/library/ff395349.aspx