it-swarm.com.de

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

Was bedeutet es, wenn JavaScript-Netzwerkaufrufe wie fetch oder XMLHttpRequest oder eine andere Art von HTTP-Netzwerkanforderung mit dem HTTP-Statuscode 0 fehlschlagen?

Dies scheint kein gültiger HTTP-Statuscode zu sein, da andere Codes aus drei Ziffern in der HTTP-Spezifikation bestehen. 

Ich habe versucht, das Netzwerk als Test vollständig zu trennen. Es kann nicht verwandt sein, aber dies führte zu Statuscode 17003 (IIRC), der durch die Cursor-Suche "DNS-Server-Suche fehlgeschlagen" bedeutet.

Derselbe Code funktioniert an einigen Standorten und Systemen problemlos. In bestimmten Umgebungen schlägt er jedoch mit Statuscode 0 fehl und es wird kein responseText bereitgestellt.

Dies ist ein typisches HTTP POST zu einer Internet-URL. Dabei handelt es sich nicht um file: //, von der ich weiß, dass sie 0 zurückgibt, um den Erfolg in Firefox anzuzeigen. 

91
mike nelson

Ich glaube, der Fehlercode zeigt an, dass die Antwort leer war (da nicht einmal Kopfzeilen zurückgegeben wurden). Dies bedeutet, dass die Verbindung akzeptiert und anschließend ordnungsgemäß geschlossen wurde (TCP FIN) . Es gibt eine Reihe von Ursachen, die dies verursachen könnten, aber aufgrund Ihrer Beschreibung scheint eine Form von Firewall die wahrscheinlichste Ursache.

45
Nick

Viele der Antworten sind falsch. Es scheint, dass die Leute herausfinden, was in ihrem speziellen Fall den Status == 0 verursachte, und diese dann als Antwort verallgemeinern.

Der Status == 0 für ein fehlgeschlagenes XmlHttpRequest sollte praktisch 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, könnte dieser Code das Ergebnis eines Fehlers sein, der bereits vor dem Kontakt mit dem Server aufgetreten ist.

Einige der häufigsten Situationen, die diesen Statuscode erzeugen, spiegeln sich in den anderen Antworten wider, es kann jedoch eines oder keines der folgenden Probleme geben:

  1. Illegales Kreuz Originantrag (siehe CORS )
  2. Firewall blockieren oder filtern
  3. Die Anfrage selbst wurde im Code storniert
  4. Eine installierte Browsererweiterung bringt alles auf den Punkt

Es wäre hilfreich, wenn Browser detaillierte Fehlerberichte für weitere dieser Status == 0 -Szenarien bereitstellen. In der Tat wird Status == 0 manchmal eine hilfreiche Konsolenmeldung begleitet, aber in anderen gibt es keine anderen Informationen.

143
whitneyland

Je nach Browser lohnt es sich bei jQuery-basierten AJAX - Aufrufen, dass der Rückruf mit dem HTTP-Statuscode 0 angezeigt wird eine andere Seite, bevor der AJAX - Aufruf abgeschlossen ist.

Nicht derselbe Technologie-Stack wie Sie, aber für jemanden hoffentlich nützlich.

32
Cory R. King

wininet.dll gibt sowohl standardmäßige als auch nicht standardmäßige 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 Anforderung auf einer lokalen Webseite auf einem Webserver oder ohne Webserver auszuführen?

XMLHttpRequest status = 0 und XMLHttpRequest statusText = unknown kann Ihnen helfen, wenn Sie Ihr Skript nicht auf einem Webserver ausführen.

13

Workaround: Was wir am Ende gemacht haben

Wir haben uns gedacht, dass es sich um Firewall-Probleme handelt, und so haben wir einen Workaround gefunden, der den Trick bewältigte. Wenn jemand das gleiche Problem hat, haben wir Folgendes getan:

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

  2. Wenn der Benutzer auf "Daten an Server senden" klickt, liest die 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. Die HTA startet einen Link zur HTML-Seite im Browser.

  4. Die HTML-Seite enthält jetzt das Javascript, das die Daten (mit Microsoft.XMLHTTP) an den Server sendet.

Hoffe, das hilft jedem, der eine ähnliche Anforderung hat. In diesem Fall war es ein Flash-Spiel, das bei Messen auf einem Laptop verwendet wurde. Wir hatten nie Zugriff auf den Laptop und konnten ihn nur per E-Mail an den Kunden senden, da diese Messe in einem anderen Land stattfand.

6
mike nelson

Ein HTTP-Antwortcode 0 gibt an, dass die Anforderung AJAX abgebrochen wurde.

Dies kann entweder aufgrund eines Timeouts, eines XHR-Abbruchs oder einer Firewall bei der Anforderung auftreten. Ein Timeout ist üblich. Dies bedeutet, dass die Anforderung nicht innerhalb einer bestimmten Zeit ausgeführt werden konnte. Ein XHR-Abbruch ist sehr einfach ... Sie können .abort () tatsächlich für ein XMLHttpRequest-Objekt aufrufen, um den Aufruf von AJAX abzubrechen. (Dies ist eine gute Vorgehensweise für eine Einzelseitenanwendung, wenn AJAX -Aufrufe keine Objekte zurückgeben und versuchen sollen, Objekte zu referenzieren, die zerstört wurden.) Wie in der markierten Antwort erwähnt, wäre dies auch eine Firewall kann die Anfrage abbrechen und diese 0-Antwort auslösen.

XHR-Abbruch: Abbruch von Ajax-Anforderungen mit jQuery

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 die Ausführung der .abort () -Methode für ein XHR-Objekt auch den Fehlerrückruf auslöst. Wenn Sie irgendeine Art von Fehlerbehandlung durchführen, die diese Objekte analysiert, werden Sie schnell feststellen, dass ein abgebrochenes XHR und ein Timeout-XHR identisch sind. Bei jQuery wird der an den Fehler-Callback übergebene textStatus jedoch beim Abbruch "abgebrochen" und "Timeout" mit einem Timeout tritt auf. Wenn Sie Zepto verwenden (sehr ähnlich zu jQuery), wird errorType beim Abbruch "error" und beim Auftreten eines Timeouts "timeout".

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

Wie in dieser Antwort auf dieser Seite ausführlich beschrieben, bedeutet ein Statuscode von 0, dass die Anforderung aus irgendeinem Grund fehlgeschlagen ist, und eine Javascript-Bibliothek interpretierte den Fehler als Statuscode von 0.

Um dies zu testen, haben Sie folgende Möglichkeiten:

1) Verwenden Sie diese Chrome-Erweiterung, Requestly , um Ihre URL von der https-Version Ihrer URL zur http-Version umzuleiten, da dies zu einem gemischten Inhaltsfehler führt und schließlich einen Statuscode von 0 generiert. Der Vorteil von Bei diesem Ansatz müssen Sie Ihre App überhaupt nicht ändern und Sie können Ihre URL einfach mit dieser Erweiterung "umschreiben".

2) Ändern Sie den Code Ihrer App, um optional eine Umleitung Ihres Endpunkts auf die http-Version Ihrer URL anstelle der https-Version (oder umgekehrt) vorzunehmen. Wenn Sie dies tun, schlägt die Anforderung mit dem Statuscode 0 fehl.

2
Brad Parks

In meinem Fall wurde der Status 0, wenn ich vergessen würde, das WWW vor meine Domain zu stellen. Da alle meine Ajax-Anforderungen http: /WWW.mydomain.com hartcodiert waren und die geladene Webseite nur http://mydomain.com war, wurde dies zu einem Sicherheitsproblem, da es sich um eine andere Domäne handelt. Am Ende machte ich eine Weiterleitung in meiner .htaccess-Datei, um immer www an die Spitze zu bringen.

2

Zusätzlich zu Lees answer finden Sie möglicherweise weitere Informationen zur tatsächlichen Ursache, indem Sie zu synchronous -Anfragen 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.

1
McX

In meinem Fall war dies darauf zurückzuführen, dass der AJAX - Aufruf aufgrund der same-Origin-Richtlinie vom Browser blockiert wurde. Es war die am wenigsten erwartete Sache, da alle meine HTMLs und Skripte von 127.0.0.1 bereitgestellt wurden. Wie können sie als unterschiedlicher Herkunft betrachtet werden?

Jedenfalls war die Ursache ein unschuldig aussehender <base>-Tag:

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

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

1
Saintali

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.

0
ExcelinEfendisi

Es wird darauf hingewiesen, dass ein Upload von Ajax-Dateien, der die client_max_body_size-Direktive für nginx überschreitet, diesen Fehlercode zurückgibt.

0
r3wt

Ich habe einen neuen und undokumentierten 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 Ursprungs-, Netzwerk- oder stornierte Anfragen (durch Code oder Benutzerführung). Nichts in der Entwicklerkonsole oder im Netzwerkprotokoll.

Zu state () konnte ich sehr wenig Dokumentation finden (Mozilla listet es nicht auf, W3C tut es) und nichts davon erwähnte "abgelehnt".

Es stellte sich heraus, dass es sich um meinen Ad Blocker (uBlock Origin auf Firefox) handelte.

0
Jonathan Amend

Für den Fall, dass jemand anderes auf dieses Problem stößt, wurden Probleme aufgrund der Anforderung AJAX und einer normalen Formularanforderung, die gesendet wurde. Ich habe es mit folgender Zeile gelöst:

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

Der Schlüssel dort ist die Rückgabe falsch, wodurch das Formular nicht gesendet wird. Sie könnten auch einfach false innerhalb von submitfunc () zurückgeben, aber ich finde das Schreiben explizit klarer.

0
samoz