Una connessione esistente è stata forzatamente chiusa dall’host remoto

Sto lavorando con un’applicazione commerciale che lancia un SocketException con il messaggio,

Una connessione esistente è stata forzatamente chiusa dall’host remoto

Questo succede con una connessione socket tra client e server. La connessione è viva e vegeta, e un mucchio di dati viene trasferito, ma poi viene disconnesso dal nulla.

Qualcuno l’ha visto prima? Quali potrebbero essere le cause? Posso indovinare alcune cause, ma c’è anche un modo per aggiungere altro in questo codice per capire quale potrebbe essere la causa?

Eventuali commenti / idee sono ben accetti.

… L’ultimo …

Ho alcune registrazioni da alcuni traccianti .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 

Sulla base di altre parti del logging ho visto il fatto che dice ‘0 # 0’ significa che un pacchetto di 0 byte di lunghezza viene inviato. Ma cosa significa veramente?

Una delle due possibilità si sta verificando, e non sono sicuro di quale,

1) La connessione viene chiusa, ma i dati vengono quindi scritti nel socket, creando così l’eccezione sopra. Lo 0 # 0 significa semplicemente che non è stato inviato nulla perché il socket era già chiuso.

2) La connessione è ancora aperta e un pacchetto di zero byte viene inviato (cioè il codice ha un bug) e 0 # 0 significa che un pacchetto di zero byte sta tentando di essere inviato.

Che cosa ne pensi? Credo che potrebbe essere inconcludente, ma forse qualcun altro ha visto questo genere di cose?

Questo in genere significa che il lato remoto ha chiuso la connessione (in genere inviando un pacchetto RST TCP / IP). Se stai lavorando con un’applicazione di terze parti, le cause probabili sono:

  • Stai inviando dati non validi all’applicazione
  • Il collegamento di rete tra client e server sta andando giù per qualche motivo
  • Hai triggersto un errore nell’applicazione di terze parti che lo ha causato l’arresto anomalo
  • L’applicazione di terze parti ha esaurito le risorse di sistema

È probabile che il primo caso sia quello che sta succedendo.

Puoi licenziare Wireshark per vedere esattamente cosa sta succedendo sul cavo per restringere il problema.

Senza informazioni più specifiche, è improbabile che qualcuno qui possa davvero aiutarti molto.

Questo non è un bug nel tuo codice. Viene dall’implementazione di Socket .Net. Se si utilizza l’implementazione sovraccaricata di EndReceive come di seguito non si ottiene questa eccezione.

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

Soluzione semplice per questo problema fastidioso comune:

Vai al tuo file.context.cs” (che si trova sotto “ .context.tt” che si trova sotto il tuo file “* .edmx”).

Quindi aggiungi questa linea al tuo costruttore:

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

spero che questo sia utile.

Aveva lo stesso bug. In realtà ha funzionato nel caso in cui il traffico è stato inviato utilizzando qualche proxy (violinista nel mio caso). Aggiornato il framework .NET da 4.5.2 a> = 4.6 e ora tutto funziona correttamente. La richiesta effettiva era:
new WebClient().DownloadData("URL");
L’eccezione era:

SocketException: una connessione esistente è stata forzatamente chiusa dall’host remoto

L’utilizzo di TLS 1.2 ha risolto questo errore.
Puoi forzare la tua applicazione usando TLS 1.2 con questo (assicurati di eseguirlo prima di chiamare il tuo servizio):

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Un’altra soluzione:
Abilitare la crittografia avanzata nel computer o server locale per utilizzare TLS1.2 perché per impostazione predefinita è disabilitato, quindi viene utilizzato solo TLS1.0.
Per abilitare la crittografia avanzata, eseguire questi comandi in PowerShell con i privilegi di amministratore:

 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 

È necessario riavviare il computer per rendere effettive queste modifiche.

Ho questa eccezione a causa del riferimento circolare in entity.In quadro che assomiglia

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

Ho aggiunto [IgnoreDataMemberAttribute] alla proprietà Parent. E questo ha risolto il problema.

Ho ottenuto questa eccezione quando stavo cercando di leggere una riga dal database che aveva un null in una colonna enum, non poteva mappare il null in un valore enum.

Ho incontrato questa eccezione, quando la proprietà DateTime della class non ha ottenuto il valore. Semplicemente rendilo annullabile DateTime e trova la soluzione.

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

Questo errore si è verificato nella mia applicazione con il protocollo CIP ogni volta che non ho inviato o ricevuto dati in meno di 10 secondi.

Ciò è stato causato dall’uso del metodo aperto in avanti. È ansible evitarlo lavorando con un altro metodo o installare una frequenza di aggiornamento inferiore a 10s che mantengono la connessione forward-open.