jQuery Ajax-Anforderungen werden abgebrochen, ohne gesendet zu werden

85

Ich versuche, ein Skript an die World-Wide Telescope-App von Microsoft anzuschließen. Letzterer wartet auf Port 5050 auf Befehle. Es läuft auf demselben Computer wie der Browser (Chrome im Moment, aber soweit ich das beurteilen kann, ist das Verhalten bei Firefox 7 und IE 9 dasselbe).

Ich sende einen "Access-Control-Allow-Origin: *" - Header mit der ursprünglichen HTML-Datei, um zu versuchen, XSS-Einschränkungen als mein Problem zu beseitigen.

Mein Code für den Zugriff auf WWT lautet wie folgt:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

Die URL lautet in diesem Fall "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ..." (offensichtlich ... ist hier eine Abkürzung für einige zusätzliche Parameter).

Wenn ich mir die Netzwerkdiagnose in Chrome ansehe, sehe ich Folgendes:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

Die Anfrage geht aus - ich sehe, dass WWT eine neue Ebene erstellt. Ich bekomme jedoch keinen Rückruf. Wenn ich einen Fehlerrückruf hinzufüge, der aufgerufen wird, die Fehlereigenschaft für das jqXHR-Objekt jedoch nur "Fehler" und der Status 0 ist. Wenn ich die Netzwerkanforderung in Chrome betrachte, wird "(abgebrochen)" als Status und keine Antwort angezeigt .

Wenn ich dieselbe URL nehme und in einen neuen Browser-Tab einfüge, kann ich sehen, dass die Antwort das erwartete XML ist.

Ein Unterschied hier ist natürlich, dass dies ein GET ist, kein POST, aber ich habe das in meinem Skript versucht und es macht keinen Unterschied.

Ich bin ziemlich verblüfft und würde mich über neue Ideen freuen.

Graham Wheeler
quelle
Haben Sie versucht, den errorRückruf zu verarbeiten, um festzustellen, ob er mit einem Fehler zurückgegeben wird?
StriplingWarrior
1
"Ich sende einen" Access-Control-Allow-Origin: * "- Header mit der ursprünglichen HTML-Datei, um zu versuchen, XSS-Einschränkungen als mein Problem zu beseitigen." Meinen Sie damit, dass der Server den Access-Control-Origin-Header zurücksendet? Oder dass Sie es zusammen mit der Ajax-Anfrage senden?
Jason Dean
Versuchen Sie, direkt über die URL auf die Seite zuzugreifen, und sehen Sie,
ob
1
Ja, ich erhalte einen Fehlerrückruf mit Statustext "" und Code 0. Dies ist kein jQuery-Problem. Ich habe den Code mit einem geraden XHR umgeschrieben und erhalte das gleiche Ergebnis - dh einen readyState von 4 mit einem request.status von Null und einem leeren request.responseText. Der Access-Control-Allow-Origin-Header wird vom Server gesendet. Wenn Sie direkt über die URL auf die Seite zugreifen, wird die erwartete XML-Antwort zurückgegeben.
Graham Wheeler

Antworten:

133

Wenn jemand anderes darauf stößt, hatten wir das Problem, dass wir die Ajax-Anfrage über einen Link stellen und nicht verhindern, dass dem Link gefolgt wird. Wenn Sie dies in einem onclickAttribut tun , stellen Sie dies ebenfalls sicher return false;.

Kazetsukai
quelle
Das hat auch bei mir funktioniert. Vielen Dank. Ich habe vergessen, warum ich in meinem onClick-Handler false zurückgegeben habe, und habe es in true geändert. Nachdem ich Ihren Beitrag gelesen habe, ist mir plötzlich klar geworden.
Shiprack
4
Wenn Sie ein Formular verwenden, müssen return falseSie außerdem das onsubmitAttribut am Ende Ihres Formulars hinzufügen .
Jason Axelson
8
@VincentClyde "return false;"weist Formulare und Links an, die Aktion abzubrechen. Dies war ursprünglich für die Validierung von Javascript-Formularen vorgesehen, bei denen eine Validierungsfunktion false zurückgibt, wenn das Formular ungültig ist, wodurch das Senden des Formulars verhindert wird.
Tyzoid
13
Sie können auch verwenden e.preventDefault();, wo eder onclickEreignisparameter ist.
Hannele
1
@Hannele Vielen Dank für das Teilen von event.preventDefault. Ich brauchte es so dringend. Ich sehe keine andere Antwort, die dies nahelegt. Sie sollten dies als separate Antwort posten.
Mohit
111

Wenn Sie Chrome verwenden, werden im Standard-Chrome-Netzwerkfenster nicht genügend Informationen angezeigt, um die Hauptursache einer (canceled)Anforderung zu ermitteln.

Sie müssen verwenden chrome://net-internals/#events, um die wichtigsten Details der von Ihnen gesendeten Anfrage anzuzeigen - einschließlich versteckter Weiterleitungen / Sicherheitsinformationen zu gesendeten Cookies usw.

Beispiel: Im Folgenden wird eine Weiterleitung angezeigt, die in der Netzwerkablaufverfolgung nicht angezeigt wurde. Dies wurde dadurch verursacht, dass meine Cookies nicht domänenübergreifend gesendet wurden:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)
Ben Walding
quelle
Ich habe auch ein (storniertes) Problem. @ Ben, es war cool, etwas über diese Spur zu erfahren, leider gab es keine Informationen. Der Server ist in meinem Fall S3 und cors ist in meinem Bucket konfiguriert. Alles was ich tue ist ein einfaches GET für ein Bild. Ich sehe in einem Netzwerkfenster eine Anfrage mit dem Origin-Header, aber keine Antwort. Anscheinend bricht Chrome die Anfrage ab, bevor sie an den Server gesendet wird. Keine Weiterleitungen, keine https, keine Inhaltslänge 0. Den ganzen Tag meinen Kopf schlagen, immer noch ein Rätsel.
Gene Vayngrib
@GeneVayngrib Probieren Sie Firefox aus - der Netzwerk-Debugger zeigt direkt weitere Informationen an. Möglicherweise können Sie das Problem dort beheben und es dann in Chrome zum Laufen bringen.
Ben Walding
@ BenW danke, aber Firefox hat kein Problem mit diesem Bild, das von Amazon S3 bereitgestellt wird.
Gene Vayngrib
YUPP. Das hat sehr geholfen!
Rubmz
21

In meinem Fall hatte ich type='submit'dies, als ich das Formular abschickte, wurde die Seite neu geladen, bevor der Ajax-Treffer losging, so dass eine einfache Lösung zu haben war type="button". Wenn Sie keinen Typ angeben, ist dieser submitstandardmäßig angegebentype="button"

type='submit' => type='button'

ODER

Kein Typ => type='button'

Schwarze Mamba
quelle
3
Necro Posting hier, verklage mich Stackoverflow. Ich habe den ganzen Tag hoch und niedrig gesucht, warum meine Anfrage über die Konsole funktioniert, aber nicht über das Skript, und das war die Antwort. Danke !!!
pcort
1
Ich habe mich angemeldet und diesen Thread wiedergefunden, um diese Antwort zu verbessern !!, das hat mir sehr geholfen. brach mir stundenlang den Kopf
dev
Jai Shree Krishna, hoffe es hilft vielen zu kommen. Und sie finden es früher heraus.
Black Mamba
6

Ich hatte ein ähnliches Problem. In meinem Fall versuche ich, einen Webdienst auf einem Apache-Server + Django zu verwenden (der Dienst wurde von mir selbst geschrieben). Ich hatte die gleiche Ausgabe wie Sie: Chrome sagt, dass sie abgebrochen wurde, während FF es in Ordnung macht. Wenn ich anstelle von Ajax versuchen würde, direkt über den Browser auf den Dienst zuzugreifen, würde dies ebenfalls funktionieren. Beim Googeln stellte ich fest, dass einige neuere Versionen von Apache die Länge der Antwort in den Antwortheadern nicht richtig eingestellt haben, also habe ich dies manuell getan. Mit Django musste ich nur:

response['Content-Length'] = len(content)

Wenn Sie die Kontrolle über den Dienst haben, auf den Sie zugreifen möchten, erfahren Sie, wie Sie den Antwortheader auf der von Ihnen verwendeten Plattform ändern können. Andernfalls müssen Sie sich an den Dienstanbieter wenden, um dieses Problem zu beheben. Anscheinend können FF und viele andere Browser diese Situation korrekt handhaben, aber Chrome-Designer haben beschlossen, dies wie angegeben zu tun.

Felipe Sodre Silva
quelle
Ich habe versucht, den Header für die Inhaltslänge festzulegen, und habe immer noch das gleiche Problem wie in der ursprünglichen Frage beschrieben. Ich benutze PHP 5.3.8 und Apache 2.2.21 (mit WAMP in Windows 7)
rodrigo-silveira
4

Ich hatte ein ähnliches Problem. Mit chrome: // net-internals / # events konnte ich feststellen, dass mein Problem auf eine stille Umleitung zurückzuführen war. Meine Get-Anfrage wurde in einem Onload-Skript ausgelöst. Die URL hatte die Form " http://example.com/inner-path " und der 301 leitete permanent zu "/ inner-path" um. Um das Problem zu beheben, habe ich einfach die URL in "/ inner-path" geändert und das Problem wurde behoben. Ich weiß immer noch nicht, warum ein Skript, das vor einer Woche funktioniert hat, mir plötzlich Probleme bereitete ... Ich hoffe, das hilft jemandem

RedEight
quelle
3

(Verwenden von Web Forms ASP.NET)

Mein Problem war, dass ich versucht habe, Ajax aus dem Klickereignis einer Senden-Schaltfläche auszulösen, für die ein serverseitiges Klickereignis eingerichtet wurde. Ich musste den Knopf nur zu einem einfachen Knopf machen (dh <input type="button">)

Kontaktmatt
quelle
Vielen Dank.
Farheen Nilofer
3

Ich hatte das gleiche Problem, für mich habe ich den Iframe vorübergehend erstellt und den Iframe entfernt, bevor der Ajax vollständig ist, damit der Browser meine Ajax-Anfrage abbricht.

Reza
quelle
Wie haben Sie dieses Problem gelöst? Meine Website wird in einen von mir nicht kontrollierten iFrame eingebettet. Ich möchte, dass mein Anruf abgeschlossen wird, da einige Hintergrunddaten festgelegt werden
Rips
@Rips das ist seit 4 Jahren, trotzdem denke ich, ich habe es mit Promises
Reza
3

Wenn Sie die Antwort von @ Kazetsukai erweitern, kann dieses Problem auftreten, wenn Sie Ihre AJAX-Anfrage vom Benutzer stellen, der auf einen Link klickt.

Wenn Sie Ihren Link so einrichten:

<a href="#" onclick="soAjax()">click me!</a>

Und dann ein Javascript-Handler wie der folgende:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

Um zu verhindern, dass Ihr Browser dem Link folgt und laufende Anforderungen abbricht, sollten Sie Folgendes hinzufügen return falseoder e.preventDefault()die Weitergabe des Klickereignisses verhindern:

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

Oder:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}
Hannele
quelle
1

Ich habe diesen Fehler erhalten, als ich eine Anfrage über http an eine URL gestellt habe, für die https erforderlich ist. Ich denke, der Ajax-Aufruf behandelt die Umleitung nicht. Dies ist auch dann der Fall, wenn die Option crossDomain ajax auf true gesetzt ist (in JQuery 1.5.2).

ptutt
quelle
1

Es gibt zwei Möglichkeiten, wenn eine AJAX-Anfrage gelöscht wird (wenn nicht eine Cross-Origin-Anfrage):

  1. Sie verhindern nicht das Standardverhalten des Elements für das Ereignis.
  2. Sie haben das Timeout von AJAX zu niedrig eingestellt oder der Netzwerk- / Anwendungs-Backend-Server ist langsam.

Lösung für 1) : Hinzufügen return false;oder e.preventDefault();im Ereignishandler.

Lösung für 2) : Fügen Sie eine Timeout-Option hinzu, während Sie die AJAX-Anforderung erstellen. Beispiel unten.

$.ajax({
    type: 'POST',
    url: url,
    timeout: 86400,
    data: data,
    success: success,
    dataType: dataType
});

Aktivieren Sie für Cross-Origin-Anforderungen die CORS-HTTP-Header (Cross-Origin Resource Sharing).

AnkitK
quelle
0

In meinem Fall stimmte das Mod-Rewrite von Apache mit der URL überein und leitete die Anfrage an https um.

Schauen Sie sich die Anfrage in chrome: // net-internals / # events an.

Es wird ein internes Protokoll der Anforderung angezeigt. Suchen Sie nach Weiterleitungen.

bbrame
quelle
0

Ich hatte das gleiche Problem, aber in meinem Fall stellte sich heraus, dass es sich um ein Cookie-Problem handelte. Die Leute, die am Back-End arbeiteten, hatten den Pfad des JSESSIONID-Cookies geändert, das beim Anmelden bei unserer App festgelegt wurde, und ich hatte ein altes Cookie mit diesem Namen auf meinem Computer, aber mit dem alten Pfad. Als ich versuchte, mich im Browser (Chrome) anzumelden, wurden zwei Cookies mit dem Namen JSESSIONID mit unterschiedlichen Werten an den Server gesendet - was verständlicherweise verwirrte -, sodass die Anforderung abgebrochen wurde. Das Löschen der Cookies von meinem Computer hat das Problem behoben.

Joe Dyndale
quelle
0

Ich hatte diesen Fehler auf eine gruseligere Art und Weise: Die Registerkarte "Netzwerk" und die Ereignisse "chrome: // net-internals / #" zeigten die Anforderung nicht an, nachdem das js abgeschlossen war. Beim Anhalten des js im Fehler-Callcack wurde auf der Registerkarte "Netzwerk" die Anforderung als (abgebrochen) angezeigt. Das wurde konsequent für genau eine (immer die gleiche) von mehreren ähnlichen Anfragen auf einer Webseite aufgerufen. Nach dem Neustart von Chrome ist der Fehler nicht wieder aufgetreten!

Christian
quelle
0

Ich hatte das in Firefox abgesagt . Einige Ajax-Anrufe funktionierten für mich einwandfrei, aber für den Mitarbeiter, der sie tatsächlich verwenden musste, schlug dies fehl.

Als ich dies über die oben genannten Chrome-Tricks überprüfte, fand ich nichts Verdächtiges. Beim Einchecken in Firebug wurde die Animation "Laden" nach den beiden kleinen Aufrufen und keine Registerkarte "Ergebnis" angezeigt.

Die Lösung war mega einfach: In die Geschichte gehen, die Website finden, mit der rechten Maustaste klicken -> Website vergessen.
Vergessen, nicht löschen.

Danach keine Probleme mehr. Ich vermute, es hat etwas mit dem .htaccess zu tun.

Martijn
quelle
0

In meinem Fall war es der fehlende Schrägstrich in der URL. Das Hinzufügen des abschließenden Schrägstrichs löste mein Problem.

Aftab Baig
quelle
0

Für den Fall Dropzone.js. In meinem Fall wurde es verursacht, weil der timeoutOptionswert standardmäßig zu niedrig war. Erhöhen Sie es also um Ihre Bedürfnisse.

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}
Scofield
quelle
-1

Ich hatte dieses Problem mit einem bestimmten 3G-Netzwerk.
Bei DELETE-Anforderungen mit net_error = -101in chrome: // net-internals / # -Ereignissen würde dies immer fehlschlagen .

Andere Netzwerke haben einwandfrei funktioniert, daher gehe ich davon aus, dass ein fehlerhafter Proxyserver oder ähnliches vorhanden war.

Dan Abramov
quelle