Ich arbeite mit einer kommerziellen Anwendung, die eine SocketException mit der Nachricht auslöst.
Eine bestehende Verbindung wurde vom Remote-Host zwangsweise geschlossen
Dies geschieht bei einer Socket-Verbindung zwischen Client und Server. Die Verbindung ist lebendig und gut, und es werden Datenmengen übertragen, die dann jedoch aus dem Nichts getrennt werden.
Hat das schon mal jemand gesehen? Was könnten die Ursachen sein? Ich kann ein paar Ursachen erraten, aber gibt es auch eine Möglichkeit, mehr in diesen Code einzufügen, um herauszufinden, was die Ursache sein könnte?
Kommentare / Ideen sind willkommen.
... Das Neueste ...
Ich habe einige Protokolle von einer .NET-Ablaufverfolgung,
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 mit einer Länge von 0 Bytes gesendet wird. Aber was bedeutet das wirklich?
Eine von zwei Möglichkeiten tritt auf, und ich bin nicht sicher, welche,
1) Die Verbindung wird geschlossen, aber dann werden Daten 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 es wird ein Paket mit null Bytes gesendet (dh der Code hat einen Fehler). Die 0 # 0 bedeutet, dass ein Paket mit null Bytes versucht wird, gesendet zu werden.
Was glaubst du? Es mag nicht schlüssig sein, denke ich, aber vielleicht hat jemand anderes so etwas gesehen?
quelle
Antworten:
Dies bedeutet im Allgemeinen, dass die Remote-Seite die Verbindung geschlossen hat (normalerweise durch Senden eines TCP / IP-
RST
Pakets). Wenn Sie mit einer Drittanbieteranwendung arbeiten, sind die folgenden Ursachen wahrscheinlich:Es ist wahrscheinlich, dass der erste Fall ist, was passiert.
Sie können Wireshark starten , um genau zu sehen, was auf dem Draht passiert, um das Problem einzugrenzen.
Ohne genauere Informationen ist es unwahrscheinlich, dass Ihnen hier jemand wirklich viel helfen kann.
quelle
https
Anfrage an einenhttp
Server bedeuten kann und wahrscheinlich auch umgekehrt.Die Verwendung von TLS 1.2 hat diesen Fehler behoben.
Sie können Ihre Anwendung mit TLS 1.2 damit erzwingen (stellen Sie sicher, dass Sie sie ausführen, bevor Sie Ihren Dienst aufrufen):
Eine andere Lösung:
Aktivieren Sie eine starke Kryptografie auf Ihrem lokalen Computer oder Server, um TLS1.2 zu verwenden, da diese standardmäßig deaktiviert ist und nur TLS1.0 verwendet wird.
Führen Sie diese Befehle in PowerShell mit Administratorrechten aus, um eine starke Kryptografie zu ermöglichen:
Sie müssen Ihren Computer neu starten, damit diese Änderungen wirksam werden.
quelle
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, wird diese Ausnahme nicht angezeigt.
quelle
EndReceive
eine Ausnahme ausgelöst wird, wenn eine ordnungsgemäße Client-Kündigung vorliegt. Wusste nicht, dass dies beabsichtigt ist. Ich finde es schlecht, Ausnahmen in normalen Code-Flows auszulösen. Gott sei Dank für die überladene Methode.StateObject
Klasse mitpublic byte[] buffer = new byte[1024], public Socket socket;
einer aufgerufenen Funktion haben und diese aufrufenReceive(Socket s)
, die dies tutStateObject so = new StateObject(); so.socket = s; s.BeginReceive(so.buffer, 0, 256, 0, new AsyncCallback(ReceiveCallback), so);
und in dervoid ReceiveCallback(IAsyncResult ar)
Sie diesen Code oben aufrufen.Send
bevor Sie etwas anderes tun können.Einfache Lösung für dieses häufig auftretende nervige Problem:
Gehen Sie einfach zu Ihrer Datei " .context.cs" (unter " .context.tt", die sich unter Ihrer Datei "* .edmx" befindet).
Fügen Sie dann diese Zeile Ihrem Konstruktor hinzu:
hoffe das ist hilfreich.
quelle
socket.Send(x); byte[] buffer = new byte[1]; socket.Receive(buffer, 0, 1, 0);
die zurückgegebenen Bytes einfach lesen, was das Problem des OP war.ENTITY FRAMEWORK
nur diese Lösung funktioniert !!! nur das ! danke Bruder :)Hatte den gleichen Fehler. Funktionierte tatsächlich, falls der Datenverkehr über einen Proxy gesendet wurde (in meinem Fall Geiger). Das .NET Framework wurde von 4.5.2 auf> = 4.6 aktualisiert und jetzt funktioniert alles einwandfrei. Die eigentliche Anfrage war:
new WebClient().DownloadData("URL");
Die Ausnahme war:
quelle
Ich habe diese Ausnahme aufgrund eines Zirkelverweises in der Entität. In der Entität, die aussieht wie
Ich habe [IgnoreDataMemberAttribute] zur Parent-Eigenschaft hinzugefügt. Und das hat das Problem gelöst.
quelle
Bei Ausführung in einem .Net 4.5.2-Dienst
Für mich verschärfte sich das Problem, weil der Anruf in einem .Net 4.5.2-Dienst ausgeführt wurde. Ich folgte dem Vorschlag von @willmaz, bekam aber einen neuen Fehler.
Beim Ausführen des Dienstes mit aktivierter Protokollierung habe ich festgestellt, dass das Handshake mit der Zielwebsite in Ordnung ist (und das Inhaber-Token sendet), aber im folgenden Schritt zum Verarbeiten des Post-Aufrufs scheint das Authentifizierungstoken gelöscht zu werden, und die Site würde dies tun antworte mit
Unauthorized
.Es stellte sich heraus, dass die Anmeldeinformationen des Servicepools keine Rechte zum Ändern von TLS (?) Hatten, und als ich mein lokales Administratorkonto in den Pool einfügte, funktionierte alles.
quelle
Für alle, die diese Ausnahme beim Lesen von Daten aus dem Stream erhalten, kann dies hilfreich sein. Ich habe diese Ausnahme beim Lesen der HttpResponseMessage in einer Schleife wie der folgenden erhalten:
Nach einiger Zeit stellte ich fest, dass der Schuldige die Puffergröße war, die zu klein war und mit meiner schwachen Azure-Instanz nicht gut spielte. Was half, war, den Code zu ändern in:
Die CopyTo () -Methode hat eine Standardpuffergröße von 81920. Der größere Puffer beschleunigte den Prozess und die Fehler wurden sofort gestoppt, höchstwahrscheinlich, weil die Gesamtdownloadgeschwindigkeit gestiegen ist. Aber warum sollte die Downloadgeschwindigkeit eine Rolle spielen, um diesen Fehler zu verhindern?
Es ist möglich, dass Sie vom Server getrennt werden, da die Download-Geschwindigkeiten unter den Mindestschwellenwert fallen, für den der Server konfiguriert ist. Wenn beispielsweise die Anwendung, von der Sie die Datei herunterladen, auf IIS gehostet wird, kann dies ein Problem mit der Konfiguration von http.sys sein:
"Http.sys ist der http-Protokollstapel, den IIS zur Durchführung der http-Kommunikation mit Clients verwendet. Er verfügt über einen Timer namens MinBytesPerSecond, der für das Beenden einer Verbindung verantwortlich ist, wenn die Übertragungsrate unter einen Schwellenwert von kb / s fällt. Standardmäßig ist dieser Schwellenwert auf 240 kb / s eingestellt. "
Das Problem wird in diesem alten Blogpost des TFS-Entwicklungsteams beschrieben und betrifft speziell IIS, kann Sie jedoch in die richtige Richtung weisen. Es wird auch ein alter Fehler erwähnt, der mit diesem http.sys-Attribut zusammenhängt: link
Wenn Sie Azure-App-Dienste verwenden und das Problem durch Erhöhen der Puffergröße nicht behoben werden kann, versuchen Sie auch, Ihren Computer zu skalieren. Sie erhalten mehr Ressourcen einschließlich der Verbindungsbandbreite.
quelle
Ich hatte das gleiche Problem und konnte es schließlich lösen. In meinem Fall war an den Port, an den der Client die Anforderung sendet, kein SSL-Zertifikat gebunden. Also habe ich das Problem behoben, indem ich ein SSL-Zertifikat an den Port auf der Serverseite gebunden habe. Sobald dies erledigt war, verschwand diese Ausnahme.
quelle
Dieser Fehler trat in meiner Anwendung mit dem CIP-Protokoll immer dann auf, wenn ich in weniger als 10 Sekunden keine Daten gesendet oder empfangen habe.
Dies wurde durch die Verwendung der Forward-Open-Methode verursacht. Sie können dies vermeiden, indem Sie mit einer anderen Methode arbeiten oder eine Aktualisierungsrate von weniger als 10 Sekunden installieren, um Ihre Forward-Open-Verbindung aufrechtzuerhalten.
quelle