Eine bestehende Verbindung wurde vom Remote-Host zwangsweise geschlossen

Ich arbeite mit einer kommerziellen Anwendung, die eine SocketException mit der Nachricht austriggers,

Eine bestehende Verbindung wurde vom Remote-Host zwangsweise geschlossen

Dies geschieht mit einer Socket-Verbindung zwischen Client und Server. Die Verbindung ist lebendig und gut, und es werden viele Daten übertragen, die dann aber aus dem Nichts getrennt werden.

Hat das jemand schon mal gesehen? Was könnten die Ursachen sein? Ich kann einige Ursachen erraten, aber gibt es auch eine Möglichkeit, mehr in diesen Code zu integrieren, um herauszufinden, was die Ursache sein könnte?

Alle Kommentare / Ideen sind willkommen.

… Das Neueste …

Ich habe etwas Logging von einigen .NET-Tracing,

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 

Basierend auf anderen Teilen der Protokollierung habe ich die Tatsache gesehen, dass “0 # 0” bedeutet, dass ein Paket von 0 Bytes Länge gesendet wird. Aber was bedeutet das wirklich?

Es gibt eine von zwei Möglichkeiten, und ich bin nicht sicher welche,

1) Die Verbindung wird geschlossen, aber Daten werden dann in den Socket geschrieben, wodurch die obige Ausnahme entsteht. Die 0 # 0 bedeutet einfach, dass nichts gesendet wurde, weil der Socket bereits geschlossen war.

2) Die Verbindung ist noch offen, und ein Paket von null Bytes wird gesendet (dh der Code hat einen Fehler) und die 0 # 0 bedeutet, dass ein Paket von Null Bytes gesendet werden soll.

Was glaubst du? Es mag vielleicht nicht schlüssig sein, aber vielleicht hat jemand anderes so etwas gesehen?

Dies bedeutet im Allgemeinen, dass die entfernte Seite die Verbindung geschlossen hat (normalerweise durch Senden eines TCP / IP- RST Pakets). Wenn Sie mit einer Anwendung eines Drittanbieters arbeiten, sind die folgenden Ursachen wahrscheinlich:

  • Sie senden errorshafte Daten an die Anwendung
  • Die Netzwerkverbindung zwischen dem Client und dem Server wird aus irgendeinem Grund unterbrochen
  • Sie haben einen Fehler in der Anwendung des Drittanbieters ausgetriggers, der zum Absturz führte
  • Die Drittanbieteranwendung hat Systemressourcen erschöpft

Es ist wahrscheinlich, dass der erste Fall ist, was passiert.

Sie können Wireshark einschalten , um genau zu sehen, was auf dem Draht passiert, um das Problem einzugrenzen.

Ohne genauere Informationen ist es unwahrscheinlich, dass jemand hier Ihnen wirklich helfen kann.

Dies ist kein Fehler in Ihrem Code. Es stammt aus der Socket-Implementierung von .Net. Wenn Sie die überladene Implementierung von EndReceive wie folgt verwenden, erhalten Sie diese Ausnahme nicht.

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

Einfache Lösung für dieses häufige Problem:

Gehen Sie einfach zur Datei.context.cs” (unter “ .context.tt”, die sich unter Ihrer “* .edmx” Datei befindet).

Fügen Sie dann diese Zeile zu Ihrem Konstruktor hinzu:

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

hoffe das ist hilfreich.

Hatte den gleichen Fehler. Wirklich funktioniert für den Fall, dass der Verkehr mit einem Proxy (in meinem Fall Fiddler) gesendet wurde. .NET Framework von 4.5.2 auf> = 4.6 aktualisiert und jetzt funktioniert alles einwandfrei. Die eigentliche Anfrage war:
new WebClient().DownloadData("URL");
Die Ausnahme war:

SocketException: Eine bestehende Verbindung wurde vom Remote-Host zwangsweise geschlossen

Mit TLS 1.2 wurde dieser Fehler behoben.
Sie können damit Ihre Anwendung mit TLS 1.2 erzwingen (stellen Sie sicher, dass Sie sie ausführen, bevor Sie Ihren Dienst anrufen):

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Eine andere Lösung :
Aktivieren Sie starke Kryptografie auf Ihrem lokalen Computer oder Server, um TLS1.2 zu verwenden, da es standardmäßig deaktiviert ist, sodass nur TLS1.0 verwendet wird.
Um starke Kryptographie zu aktivieren, führen Sie diese Befehle in PowerShell mit Administratorrechten aus:

 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 

Sie müssen Ihren Computer neu starten, damit diese Änderungen wirksam werden.

Ich habe diese Ausnahme wegen des Zirkelverweises in der Entität. In der Entität, die aussieht

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

Ich habe [IgnoreDataMemberAttribute] zur Parent-Eigenschaft hinzugefügt. Und das hat das Problem getriggers.

Ich habe diese Ausnahme erhalten, als ich versuchte, eine Zeile aus der database zu lesen, die in einer enum-Spalte einen Nullwert hatte. Sie konnte den Nullwert nicht in einen enum-Wert umwandeln.

Ich habe diese Ausnahme gefunden, als die DateTime-Eigenschaft der class den Wert nicht erhalten hat. Einfach NULL-fähiges DateTime machen und die Lösung finden.

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

Dieser Fehler trat in meiner Anwendung mit dem CIP-Protokoll immer dann auf, wenn ich keine Daten in weniger als 10s gesendet oder empfangen habe.

Dies wurde durch die Verwendung der Vorwärtsoffen-Methode verursacht. Sie können dies vermeiden, indem Sie mit einer anderen Methode arbeiten oder eine Aktualisierungsrate von weniger als 10s installieren, die Ihre Vorwärts-Open-Verbindung aufrechterhält.