Una conexión existente fue cerrada a la fuerza por el host remoto

Estoy trabajando con una aplicación comercial que está lanzando una SocketException con el mensaje,

Una conexión existente fue cerrada a la fuerza por el host remoto

Esto sucede con una conexión de socket entre el cliente y el servidor. La conexión está viva y bien, y se están transfiriendo montones de datos, pero luego se desconecta de la nada.

Alguien ha visto esto antes? ¿Cuáles podrían ser las causas? Puedo adivinar algunas causas, pero también hay alguna forma de agregar más en este código para averiguar cuál podría ser la causa?

Cualquier comentario / ideas son bienvenidos.

… Lo último …

Tengo un poco de registro de algún rastreo .NET,

System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send - An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0 

Basado en otras partes del registro, he visto el hecho de que dice ‘0 # 0’ significa que se está enviando un paquete de 0 bytes de longitud. Pero, ¿qué significa esto realmente?

Una de las dos posibilidades está ocurriendo, y no estoy seguro de cuál,

1) La conexión se cierra, pero los datos se escriben en el socket, creando así la excepción anterior. El 0 # 0 simplemente significa que no se envió nada porque el socket ya estaba cerrado.

2) La conexión aún está abierta, y se está enviando un paquete de cero bytes (es decir, el código tiene un error) y el 0 # 0 significa que un paquete de cero bytes está tratando de enviarse.

¿Que cuentas? Puede que no sea concluyente, supongo, pero tal vez alguien más haya visto este tipo de cosas.

Esto generalmente significa que el lado remoto cerró la conexión (generalmente enviando un paquete TCP / IP RST ). Si está trabajando con una aplicación de un tercero, las causas probables son:

  • Está enviando datos malformados a la aplicación
  • El enlace de red entre el cliente y el servidor está bajando por alguna razón
  • Ha desencadenado un error en la aplicación de terceros que causó su locking
  • La aplicación de terceros ha agotado los recursos del sistema

Es probable que el primer caso sea lo que está sucediendo.

Puede disparar Wireshark para ver exactamente qué está sucediendo en el cable para reducir el problema.

Sin información más específica, es poco probable que alguien aquí realmente pueda ayudarlo mucho.

Esto no es un error en tu código. Viene de la implementación de .Net’s Socket. Si usa la implementación sobrecargada de EndReceive como a continuación, no obtendrá esta excepción.

  SocketError errorCode; int nBytesRec = socket.EndReceive(ar, out errorCode); if (errorCode != SocketError.Success) { nBytesRec = 0; } 

Solución simple para este problema molesto común:

Simplemente vaya a su archivo.context.cs” (ubicado debajo de “ .context.tt” que se encuentra debajo de su archivo “* .edmx”).

Luego, agrega esta línea a tu constructor:

 public DBEntities() : base("name=DBEntities") { this.Configuration.ProxyCreationEnabled = false; // ADD THIS LINE ! } 

Espero que esto sea útil.

Tenía el mismo error. Realmente funcionó en caso de que el tráfico se haya enviado utilizando algún proxy (violín en mi caso). Marco .NET actualizado de 4.5.2 a> = 4.6 y ahora todo funciona bien. La solicitud real fue:
new WebClient().DownloadData("URL");
La excepción fue:

SocketException: una conexión existente fue cerrada a la fuerza por el host remoto

El uso de TLS 1.2 resolvió este error.
Puede forzar su aplicación usando TLS 1.2 con esto (asegúrese de ejecutarlo antes de llamar a su servicio):

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Otra solución :
Habilite la criptografía fuerte en su máquina o servidor local para usar TLS1.2 porque de manera predeterminada está deshabilitada, por lo que solo se usa TLS1.0.
Para habilitar la criptografía fuerte, ejecute estos comando en PowerShell con privilegios de administrador:

 Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 

Debe reiniciar su computadora para que estos cambios surtan efecto.

Tengo esta excepción debido a la referencia circular en la entidad. En la entidad que se parece a

 public class Catalog { public int Id { get; set; } public int ParentId { get; set; } public Catalog Parent { get; set; } public ICollection ChildCatalogs { get; set; } } 

Agregué [IgnoreDataMemberAttribute] a la propiedad Parent. Y eso resolvió el problema.

Obtuve esta excepción cuando estaba tratando de leer una fila de la base de datos que tenía un nulo en una columna enum, no podía asignar el nulo en un valor enum.

Me encontré con esta Excepción, cuando la propiedad DateTime de la clase no obtiene el valor. Simplemente lo hago nulo DateTime y Encontré la solución.

 public class PlanningBoardBO { ... Other Properties ... public DateTime? PickupDate { get; set; } ... Here changed DateTime to DateTime? } 

Este error ocurrió en mi aplicación con el protocolo CIP cuando no envié o recibí datos en menos de 10s.

Esto fue causado por el uso del método abierto directo. Puede evitar esto trabajando con otro método o instalar una tasa de actualización de menos los 10 que mantienen su conexión de apertura anticipada.