Was bedeutet es, wenn eine HTTP-Anfrage den Statuscode 0 zurückgibt?

130

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.

mike nelson
quelle
Könnte es an einer Firewall liegen? Auf welchem ​​Betriebssystem führt Ihr Client die App aus?
Shahkalpesh
Könnte
shasi kanth
In Verbindung stehender Beitrag - Was bedeutet HTTP-Statuscode 0
RBT
Ich habe das gleiche Problem in Firefox habe und fand heraus , dass ein Werbeblocker verhindert alle Anforderungen an URLs Plugin, die das Wortbanner
Jan

Antworten:

56

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.

Nick
quelle
2
Ich denke du hast wahrscheinlich recht. (Obwohl, wie von @sleepycod hervorgehoben, von wininet.dll erwartet wird, dass er einen Statuscode zurückgibt, wenn kein echter http-Statuscode vorliegt.)
mike nelson
1
Dies ist nicht unbedingt richtig. Ich hatte das gleiche Problem, aber in meinem Fall wurde nie eine Anfrage gesendet. Der Grund dafür war , dass ein Firefox Werbeblocker Anfragen verhindert deren URLs enthalten das Wortbanner
Jan
194

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:

  1. Illegale Cross-Origin-Anfrage (siehe CORS )
  2. Firewall blockieren oder filtern
  3. Die Anfrage selbst wurde im Code storniert
  4. Eine installierte Browser-Erweiterung bringt die Dinge durcheinander

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.

Whitneyland
quelle
4
Das Firefox-Addon NoScript kann die XHR-Anforderung an nicht vertrauenswürdige Hosts abbrechen.
Ivan Solntsev
5
+ 1, das ist alles genau und "es ist ein Fehler aufgetreten" ist die praktische Interpretation. Für Personen, die an einer umfassenden Liste möglicher Ursachen interessiert sind, die in der Spezifikation angegeben sind, habe ich eine Aufschlüsselung unter stackoverflow.com/a/26451773/1709587 veröffentlicht .
Mark Amery
1
Zu den von Mark Amery beschriebenen Fällen, die mir am meisten Probleme bereiten, gehört der Fall cors. Wenn der Fehler dazu führt, dass die Antwort die Cors-Validierung fehlschlägt, erhalten Sie anstelle des http-Status den Status 0, da auf die Antwort nicht zugegriffen werden kann, wenn die Cors-Validierung fehlschlägt. Besonders frustrierend, wenn Sie versuchen, eine zu wartende Web-API zu erkennen und auf 503 zu reagieren. Wenn diese API während der Wartung keine Cors berücksichtigt, können Sie die 503 nicht erkennen. Sie erhalten nur 0, was durch so viele andere verursacht werden kann Dinge.
Frédéric
CORS-Problem, mit dem ich konfrontiert war: Erwägen Sie die Verwendung httpanstelle von, httpswenn Ihre Seite ursprünglich durchgeladen wurde, httpund umgekehrt. Ein weiterer Worte führen keine Ajax POSTüber , httpswenn Ihre Seite wurde über zugegriffen httpund nicht durchführen Ajax POSTüber , httpwenn Ihre Seite initiallly über zugegriffen wurde https.
Victor Ponamarev
Synchrone Anforderungen lösen
McX
35

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.

Cory R. King
quelle
Ja, die Leute bekommen dieses Problem wahrscheinlich sehr oft, da diese Seite 10.000 Aufrufe hatte.
Mike Nelson
Oder sollte ich 25.000 Aufrufe sagen?
Mike Nelson
3
Es ist viel wert: Es ist genau das, was bei meinen automatisierten Tests fehlgeschlagen ist. Vielen Dank!
Alexfernandez
Upvoted nicht, weil dies "die" richtige Antwort ist, sondern weil es in meinem Fall passiert ist.
Juan Mendes
Dies tritt definitiv auf, aber es ist nicht der einzige Grund, warum Sie den Fehlercode == 0 sehen. Sie können nicht davon ausgehen, dass nur der Benutzer weg navigiert und daher Fehlermeldungen dieses Typs herausfiltert.
Wal
14

wininet.dll Gibt sowohl Standard- als auch Nicht-Standard-Statuscodes zurück, die unten aufgeführt sind.

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

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.

Christophe Eblé
quelle
Danke für die Codes. Nein, es handelt sich nicht um eine lokale Anfrage, sondern um eine Anfrage an einen Webserver im Internet von einem lokal ausgeführten vbscript.
Mike Nelson
6

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:

  1. Wir schreiben die Daten weiterhin wie zuvor mit einem HTA in eine Textdatei auf der lokalen Festplatte.

  2. 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).

  3. Der HTA startet einen Link zur HTML-Seite im Browser.

  4. 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.

mike nelson
quelle
Hallo, ich untersuche ein ähnliches Problem, das bei einem Kunden in der Produktion auftritt. Sie sagen, das Problem für Sie wurde durch eine Firewall verursacht. Erinnern Sie sich zufällig daran, welche Auswirkungen die Firewall hatte oder was die Firewall getan hat, um dies zu verursachen?
Ibrahim Najjar
5

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

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()

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".

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);
Cory Danielson
quelle
4

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 httpsVersion Ihrer URL zur httpVersion, 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 httpVersion Ihrer URL anstatt zur httpsVersion umleitet (oder umgekehrt). In diesem Fall schlägt die Anforderung mit dem Statuscode 0 fehl.

Brad Parks
quelle
1
"Verwenden Sie diese Chrome-Erweiterung" - Eine Chrome-Erweiterung? In einer HTA-Anwendung?
Quentin
4
Guter Punkt sicher! Aber die meisten Leute, die hier ankommen, kommen nicht für HTA-Anwendungen hierher. Sie googeln "Javascript http Status Code 0" oder so ähnlich und kommen hier an - daher denke ich, dass der HTA-Teil dieser Frage insgesamt von der geringsten Bedeutung ist und letztendlich immer noch relevant ist.
Brad Parks
2

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.

Mitweltbürger
quelle
1

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:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

Ich habe das <base>Tag entfernt, das ich übrigens nicht brauchte, und jetzt funktioniert es gut!

Saintali
quelle
1

Ich habe einen neuen und nicht dokumentierten Grund für den Status == 0 gefunden. Folgendes hatte ich:

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

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).

Jonathan Amend
quelle
1

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:

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

Zum Beispiel :

NetworkError: Ein Netzwerkfehler ist aufgetreten.

McX
quelle
0

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:

<form onsubmit="submitfunc(); return false;">

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.

Samoz
quelle
1
Prevent Default funktioniert auch hier. Es ist eine Javascript-Funktion, die verhindert, dass der Browser während Ereignissen Standardverhalten ausführt, sodass Sie native Funktionen sauber überschreiben / verhindern können ... return false macht dasselbe.
Cory Danielson
0

Es ist zu beachten, dass ein Ajax-Datei-Upload, der die client_max_body_sizeAnweisung für nginx überschreitet, diesen Fehlercode zurückgibt.

r3wt
quelle
0

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.

ExcelinEfendisi
quelle
0

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:

<!-- javascript request inside the page -->
<script>
var ajaxurl = "https://example.com/wp-admin/admin-ajax.php";
(...)
</script>

Und Ihre Seite wurde folgendermaßen angefordert:

http://example.com/example-page/2019/09/13/my-post/#elf_l1_Lw

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.

Aldemarcalazane
quelle