Pertanyaan Permintaan jQuery Ajax dibatalkan tanpa dikirim


Saya mencoba menghubungkan skrip ke aplikasi Microsoft World-Wide Telescope. Yang terakhir mendengarkan port 5050 untuk perintah. Ini berjalan di mesin yang sama dengan browser (Chrome sekarang, tetapi sejauh yang saya tahu perilaku ini sama dengan Firefox 7 dan IE 9).

Saya mengirim header "Access-Control-Allow-Origin: *" dengan file html asli untuk mencoba menghilangkan pembatasan XSS sebagai masalah saya.

Kode saya untuk mengakses WWT adalah sebagai berikut:

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

url dalam kasus ini adalah "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ..." (jelas ... adalah singkatan disini untuk beberapa parameter tambahan).

Melihat diagnostik jaringan di Chrome, saya bisa melihat ini:

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

Permintaan akan keluar - Saya melihat WWT membuat layer baru. Namun, saya tidak mendapatkan panggilan balik. Jika saya menambahkan callback kesalahan yang dipanggil, tetapi properti kesalahan pada objek jqXHR hanyalah "kesalahan" dan statusnya adalah 0. Jika saya melihat permintaan jaringan di Chrome saya melihat "(dibatalkan)" sebagai status dan tidak ada tanggapan .

Jika saya mengambil URL yang sama dan menempelkannya di tab browser baru, saya dapat melihat bahwa responsnya adalah XML yang diharapkan.

Tentu saja, perbedaan di sini adalah bahwa ini adalah GET bukan POST, tapi saya sudah mencobanya di skrip saya dan tidak ada bedanya.

Saya sangat bingung dengan ini dan akan menghargai ide-ide segar.


75
2017-09-28 01:05


asal


Jawaban:


Jika orang lain mengalami hal ini, masalah yang kami hadapi adalah kami membuat permintaan ajax dari tautan, dan tidak mencegah tautan itu diikuti. Jadi jika Anda melakukan ini dalam suatu onclick atribut, pastikan untuk return false; demikian juga.


122
2018-05-14 01:20



Jika Anda menggunakan Chrome, Anda tidak dapat melihat cukup informasi di panel jaringan Chrome standar untuk menentukan akar penyebab a (canceled) permintaan.

Anda perlu menggunakan chrome://net-internals/#events yang akan menunjukkan detail yang mengerikan dari permintaan yang Anda kirim - termasuk pengalihan tersembunyi / informasi keamanan tentang cookie yang dikirim dll.

misalnya berikut ini menunjukkan pengalihan yang tidak saya lihat di jejak jaringan - disebabkan oleh cookie saya tidak dikirim lintas sub-domain:

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)

98
2017-07-17 09:26



Dalam kasus saya yang saya alami type='submit' jadi ketika saya mengirimkan formulir halaman itu reload sebelum hit ajax terjadi jadi solusi sederhana adalah untuk memiliki type="button"

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


7
2017-11-05 10:48



Saya memiliki masalah serupa. Dalam kasus saya, saya mencoba menggunakan layanan web pada server apache + django (layanan ini ditulis oleh saya sendiri). Saya memiliki output yang sama seperti Anda: Chrome mengatakan itu dibatalkan saat FF melakukannya baik-baik saja. Jika saya mencoba mengakses layanan langsung pada browser, bukan ajax, itu akan berfungsi juga. Googling sekitar, saya menemukan bahwa beberapa versi yang lebih baru dari apache tidak mengatur panjang respon dengan benar di header respons, jadi saya melakukan ini secara manual. Dengan Django, yang harus saya lakukan adalah:

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

Jika Anda memiliki kontrol atas layanan yang Anda coba akses, cari tahu cara memodifikasi header respons di platform yang Anda gunakan, jika tidak Anda harus menghubungi penyedia layanan untuk memperbaiki masalah ini. Rupanya, FF dan banyak browser lain mampu menangani situasi ini dengan benar, tetapi desainer Chrome memutuskan untuk melakukannya sebagaimana ditentukan.


6
2017-10-31 03:15



Saya memiliki masalah serupa. Menggunakan chrome: // net-internals / # events Saya dapat melihat bahwa masalah saya disebabkan oleh pengalihan diam-diam. Permintaan permintaan saya dipecat dalam skrip onload. Url adalah bentuknya, "http://example.com/inner-path"Dan 301 secara permanen mengalihkan ke" / inner-path ". Untuk memperbaiki masalah saya hanya mengubah url menjadi" / inner-path "dan yang memperbaiki masalah. Saya masih tidak tahu mengapa skrip yang bekerja seminggu lalu tiba-tiba memberi saya masalah ... Semoga ini membantu seseorang


4
2017-10-08 17:18



(Menggunakan Formulir Web ASP.NET)

Masalah saya adalah saya mencoba untuk memecat Ajax dari peristiwa klik dari tombol submit yang memiliki setup event klik sisi server. Saya harus membuat tombol hanya tombol sederhana (yaitu <input type="button"> )


2
2018-05-15 14:57



Saya memiliki masalah yang sama, bagi saya saya membuat iframe untuk sementara dan saya menghapus iframe sebelum ajax menjadi selesai, jadi browser akan membatalkan permintaan ajax saya.


2
2018-03-04 20:11



Saya mendapat kesalahan ini saat membuat permintaan menggunakan http ke url yang membutuhkan https. Saya kira panggilan ajax tidak menangani redirection. Ini adalah kasus bahkan dengan opsi ajax crossDomain diatur ke true (pada JQuery 1.5.2).


1
2018-02-15 23:44



Memperluas jawaban @ Kazetsukai, Anda mungkin mengalami masalah ini jika Anda membuat permintaan AJAX Anda dari pengguna yang mengklik tautan.

Jika Anda mengatur tautan seperti ini:

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

Dan kemudian handler javascript seperti berikut:

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

Untuk mencegah browser Anda mengikuti tautan dan membatalkan permintaan apa pun yang sedang berlangsung, Anda harus menambahkan return false atau e.preventDefault() untuk menghentikan peristiwa klik dari menyebarkan:

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

Atau:

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

1
2018-04-25 21:05