Was bedeutet es, wenn JavaScript-Netzwerkaufrufe wie fetch oder XMLHttpRequest oder eine andere Art von HTTP-Netzwerkanforderung mit einem HTTP-Statuscode von 0 fehlschlagen?
Dies scheint kein gültiger HTTP-Statuscode zu sein, da andere Codes in der HTTP-Spezifikation dreistellig sind.
Ich habe versucht, das Netzwerk als Test vollständig vom Stromnetz zu trennen. Es mag nicht verwandt sein, aber das führte zu dem Statuscode 17003 (IIRC), der laut flüchtiger Suche bedeutet, dass die Suche nach DNS-Servern fehlgeschlagen ist.
Der gleiche Code funktioniert an einigen Standorten und auf allen Systemen einwandfrei. In bestimmten Umgebungen schlägt er jedoch mit dem Statuscode 0 fehl und es wird kein Antworttext bereitgestellt.
Dies ist ein typischer HTTP-POST zu einer Internet-URL. Es handelt sich nicht um file: //, von der ich verstehe, dass sie 0 zurückgibt, was auf Erfolg in Firefox hinweist.
quelle
banner
Antworten:
Ich glaube, der Fehlercode zeigt an, dass die Antwort leer war (da nicht einmal Header zurückgegeben wurden). Dies bedeutet, dass die Verbindung akzeptiert und dann ordnungsgemäß geschlossen wurde (TCP FIN). Es gibt eine Reihe von Dingen, die dies verursachen könnten, aber basierend auf Ihrer Beschreibung scheint irgendeine Form von Firewall der wahrscheinlichste Schuldige zu sein.
quelle
banner
Viele der Antworten hier sind falsch. Es scheint, dass die Leute herausfinden, was in ihrem speziellen Fall den Status == 0 verursacht hat, und dies dann als Antwort verallgemeinern.
In der Praxis sollte der Status == 0 für eine fehlgeschlagene XmlHttpRequest als undefinierter Fehler betrachtet werden.
Die tatsächliche W3C-Spezifikation definiert die Bedingungen, für die hier Null zurückgegeben wird: https://fetch.spec.whatwg.org/#concept-network-error
Wie Sie der Spezifikation (fetch oder XmlHttpRequest) entnehmen können, kann dieser Code das Ergebnis eines Fehlers sein, der bereits vor der Kontaktaufnahme mit dem Server aufgetreten ist.
Einige der häufigsten Situationen, die diesen Statuscode erzeugen, spiegeln sich in den anderen Antworten wider, es kann sich jedoch um eines oder keines dieser Probleme handeln:
Für Browser wäre es hilfreich, detaillierte Fehlerberichte für weitere dieser Status == 0-Szenarien bereitzustellen. In der Tat begleitet manchmal Status == 0 eine hilfreiche Konsolennachricht, in anderen gibt es jedoch keine anderen Informationen.
quelle
http
anstelle von,https
wenn Ihre Seite ursprünglich durchgeladen wurde,http
und umgekehrt. Ein weiterer Worte führen keine AjaxPOST
über ,https
wenn Ihre Seite wurde über zugegriffenhttp
und nicht durchführen AjaxPOST
über ,http
wenn Ihre Seite initiallly über zugegriffen wurdehttps
.Je nach Browser rufen jQuery-basierte AJAX-Aufrufe Ihren erfolgreichen Rückruf mit einem HTTP-Statuscode von 0 auf. Wir haben festgestellt, dass ein Statuscode von "0" normalerweise bedeutet, dass der Benutzer zuvor zu einer anderen Seite navigiert hat Der AJAX-Aufruf wurde abgeschlossen.
Nicht derselbe Technologie-Stack, den Sie verwenden, aber hoffentlich für jemanden nützlich.
quelle
wininet.dll
Gibt sowohl Standard- als auch Nicht-Standard-Statuscodes zurück, die unten aufgeführt sind.Versuchen Sie für den Statuscode "Null" eine Anfrage auf einer lokalen Webseite zu stellen, die auf einem Webserver oder ohne Webserver ausgeführt wird?
XMLHttpRequest status = 0 und XMLHttpRequest statusText = unknown können Ihnen helfen, wenn Sie Ihr Skript nicht auf einem Webserver ausführen.
quelle
Problemumgehung: Was wir letztendlich getan haben
Wir dachten, es hätte mit Firewall-Problemen zu tun, und fanden daher eine Problemumgehung, die den Trick machte. Wenn jemand das gleiche Problem hat, haben wir Folgendes getan:
Wir schreiben die Daten weiterhin wie zuvor mit einem HTA in eine Textdatei auf der lokalen Festplatte.
Wenn der Benutzer auf "Daten an Server zurücksenden" klickt, liest der HTA die Daten ein und schreibt eine HTML-Seite aus, die diese Daten als XML-Dateninsel enthält (tatsächlich unter Verwendung eines SCRIPT LANGUAGE = XML-Skriptblocks).
Der HTA startet einen Link zur HTML-Seite im Browser.
Die HTML-Seite enthält jetzt das Javascript, mit dem die Daten auf dem Server veröffentlicht werden (mithilfe von Microsoft.XMLHTTP).
Hoffe, dies hilft jedem mit einer ähnlichen Anforderung. In diesem Fall war es ein Flash-Spiel, das auf Messen auf einem Laptop verwendet wurde. Wir hatten nie Zugang zum Laptop und konnten ihn nur per E-Mail an den Kunden senden, da diese Messe in einem anderen Land stattfand.
quelle
Ein HTTP-Antwortcode von 0 zeigt an, dass die AJAX-Anforderung abgebrochen wurde.
Dies kann entweder durch eine Zeitüberschreitung, einen XHR-Abbruch oder eine Firewall geschehen, die auf die Anforderung stampft. Ein Timeout ist häufig. Dies bedeutet, dass die Anforderung nicht innerhalb einer bestimmten Zeit ausgeführt werden konnte. Eine XHR-Abtreibung ist sehr einfach durchzuführen. Sie können .abort () für ein XMLHttpRequest-Objekt aufrufen, um den AJAX-Aufruf abzubrechen. ( Dies ist eine gute Vorgehensweise für eine Anwendung mit nur einer Seite, wenn AJAX-Aufrufe nicht zurückgegeben werden sollen und versucht wird, auf zerstörte Objekte zu verweisen. ) Wie in der markierten Antwort erwähnt, kann eine Firewall die Anforderung auch abbrechen und auslösen 0 Antwort.
XHR-Abbruch: Ajax-Anforderungen mit jQuery abbrechen
Es ist erwähnenswert, dass das Ausführen der .abort () -Methode für ein XHR-Objekt auch den Fehlerrückruf auslöst. Wenn Sie eine Fehlerbehandlung durchführen, bei der diese Objekte analysiert werden, werden Sie schnell feststellen, dass ein abgebrochenes XHR und ein Timeout-XHR identisch sind. Bei jQuery wird der an den Fehlerrückruf übergebene textStatus jedoch beim Abbruch "abgebrochen" und "Timeout" mit einem Timeout tritt auf. Wenn Sie Zepto verwenden (sehr, sehr ähnlich zu jQuery), lautet der errorType beim Abbruch "error" und beim Auftreten eines Timeouts "timeout".
quelle
Wie in dieser Antwort auf dieser Seite beschrieben , bedeutet ein Statuscode von 0, dass die Anforderung aus irgendeinem Grund fehlgeschlagen ist, und eine Javascript-Bibliothek hat den Fehler als Statuscode von 0 interpretiert.
Um dies zu testen, können Sie einen der folgenden Schritte ausführen:
1) Mit dieser Chrome - Erweiterung, Requestly Ihrer URL von der Umleitung
https
Version Ihrer URL zurhttp
Version, da dies ein gemischten Inhalt Sicherheitsfehler verursachen und letztlich einen Statuscode von 0. Der Vorteil dieses Ansatzes erzeugen ist , dass Sie don Sie müssen Ihre App überhaupt nicht ändern, und Sie können Ihre URL mit dieser Erweiterung einfach "umschreiben".2) Ändern Sie den Code Ihrer App, damit Ihr Endpunkt optional zur
http
Version Ihrer URL anstatt zurhttps
Version umleitet (oder umgekehrt). In diesem Fall schlägt die Anforderung mit dem Statuscode 0 fehl.quelle
In meinem Fall wurde der Status 0, wenn ich vergessen würde, das WWW vor meine Domain zu stellen. Da alle meine Ajax-Anfragen fest codiert waren http: /WWW.mydomain.com und die geladene Webseite nur http://mydomain.com war, wurde es zu einem Sicherheitsproblem, da es sich um eine andere Domain handelt. Am Ende habe ich eine Weiterleitung in meiner .htaccess-Datei durchgeführt, um www immer in den Vordergrund zu stellen.
quelle
In meinem Fall lag dies daran, dass der AJAX-Aufruf vom Browser aufgrund der Richtlinie mit demselben Ursprung blockiert wurde . Es war die am wenigsten erwartete Sache, da alle meine HTMLs und Skripte von dort aus bereitgestellt wurden
127.0.0.1
. Wie könnten sie als unterschiedliche Ursprünge angesehen werden?Wie auch immer, die Grundursache war ein unschuldig aussehendes
<base>
Etikett:Ich habe das
<base>
Tag entfernt, das ich übrigens nicht brauchte, und jetzt funktioniert es gut!quelle
Ich habe einen neuen und nicht dokumentierten Grund für den Status == 0 gefunden. Folgendes hatte ich:
Es handelte sich nicht um Cross-Origin, Netzwerk oder aufgrund stornierter Anforderungen (per Code oder Benutzernavigation). Nichts in der Entwicklerkonsole oder im Netzwerkprotokoll.
Ich konnte sehr wenig Dokumentation zu state () finden (Mozilla listet es nicht auf, W3C tut es) und nichts davon erwähnte "abgelehnt".
Es stellte sich heraus, dass es mein Werbeblocker war (uBlock Origin in Firefox).
quelle
Zusätzlich zu Lees Antwort finden Sie möglicherweise weitere Informationen zur tatsächlichen Ursache, indem Sie zu synchronen Anforderungen wechseln , da Sie auch eine Ausnahme erhalten:
Zum Beispiel :
quelle
Falls jemand anderes auf dieses Problem stößt, gab es Probleme aufgrund der AJAX-Anfrage und einer normalen Formularanfrage, die gesendet wurde. Ich habe es mit folgender Zeile gelöst:
Der Schlüssel dort ist die Rückgabe false, wodurch das Formular nicht gesendet wird. Sie könnten auch einfach false aus submitfunc () zurückgeben, aber ich finde es klarer, es explizit zu schreiben.
quelle
Es ist zu beachten, dass ein Ajax-Datei-Upload, der die
client_max_body_size
Anweisung für nginx überschreitet, diesen Fehlercode zurückgibt.quelle
Wenn Sie auf einem lokalen PC testen, funktioniert dies nicht. Um das Ajax-Beispiel zu testen, müssen Sie die HTML-Dateien auf einem Webserver platzieren.
quelle
In meinem Fall trat der Fehler auf einer Seite auf, die mit dem HTTP-Protokoll angefordert wurde und in der ein Javascript enthalten ist, das versucht, eine HTTPS-Anforderung zu stellen. Und umgekehrt.
Drücken Sie nach dem Laden der Seite F12 (oder Strg + U) und sehen Sie sich den HTML-Code Ihrer Seite an. Wenn Sie so etwas in Ihrem Code sehen:
Und Ihre Seite wurde folgendermaßen angefordert:
Sie werden sicherlich mit diesem Fehler konfrontiert sein.
Um dies zu beheben, setzen Sie das Protokoll der Javascript-Anforderung auf das Protokoll der Seitenanforderung.
Diese Situation mit unterschiedlichen Protokollen für Seiten- und JS-Anfragen wurde bereits in der Antwort von Brad Parks erwähnt, aber ich denke, die hier vorgestellte Diagnosetechnik ist für die Mehrheit der Benutzer einfacher.
quelle