Kami dapat membuat ulang skenario berikut dengan andal:
- Buat halaman HTML kecil yang membuat permintaan AJAX ke server (menggunakan HTTP POST)
- Putuskan sambungan dari jaringan dan sambungkan kembali
- Pantau paket yang dihasilkan IE setelah kegagalan
Setelah koneksi jaringan gagal, IE membuat permintaan AJAX berikutnya tetapi hanya mengirim header HTTP (bukan isi) saat melakukan posting HTTP. Hal ini menyebabkan segala macam masalah di server karena ini hanya sebagian permintaan. Google masalah ini dengan Bing dan Anda akan menemukan banyak orang mengeluh tentang "kesalahan server acak" menggunakan AJAX atau kegagalan AJAX yang tidak dapat dijelaskan.
Kita tahu bahwa IE (tidak seperti kebanyakan browser lain) selalu mengirimkan HTTP POST sebagai DUA paket TCP / IP. Header dan body dikirim secara terpisah. Dalam kasus langsung setelah kegagalan, IE hanya mengirimkan header . IE tidak pernah mengirim payload dan server akhirnya merespons dengan Timeout.
Jadi pertanyaan saya adalah - mengapa ia berperilaku seperti ini? Tampaknya salah berdasarkan spesifikasi HTTP dan browser lain tidak berperilaku seperti ini. Apakah ini hanya bug? Tentunya ini menciptakan malapetaka dalam aplikasi Web berbasis AJAX yang serius.
Informasi referensi:
Ada masalah serupa, yang dipicu oleh waktu tunggu tetap-hidup HTTP yang kurang dari 1 menit dan didokumentasikan di sini:
sumber
Jawaban:
Sepertinya tidak ada jawaban yang jelas untuk pertanyaan ini, jadi saya akan memberikan data empiris saya sebagai pengganti dan memberikan beberapa cara untuk mengatasinya. Mungkin beberapa orang dalam MS suatu hari akan menjelaskan hal ini ...
Jika HTTP Keep-Alive dinonaktifkan di server, masalah ini akan hilang. Dengan kata lain, server HTTP 1.1 Anda akan menanggapi setiap permintaan Ajax dengan satu
Connection: Close
baris sebagai tanggapan. Ini membuat IE senang tetapi menyebabkan setiap permintaan Ajax membuka koneksi baru. Ini dapat berdampak signifikan pada kinerja, terutama pada jaringan latensi tinggi.Masalah dipicu dengan mudah jika permintaan Ajax dibuat secara berurutan dengan cepat. Misalnya, kami membuat permintaan Ajax setiap 100 md dan kemudian status jaringan berubah, kesalahan mudah direproduksi. Meskipun sebagian besar aplikasi mungkin tidak membuat permintaan seperti itu, Anda mungkin mengalami beberapa panggilan server yang terjadi tepat setelah satu sama lain yang dapat menyebabkan masalah ini. Sedikit cerewet membuat IE senang.
Itu terjadi bahkan tanpa otentikasi NTLM.
Itu terjadi ketika waktu tunggu tetap-hidup HTTP Anda di server lebih pendek dari default (yang default ke 60 detik di Windows). Detail tersedia di tautan yang dipermasalahkan.
Ini tidak terjadi dengan Chrome atau Firefox. FF mengirimkan satu paket jadi sepertinya untuk menghindari masalah ini sama sekali.
Itu terjadi di IE 6, 7, 8. Tidak dapat mereproduksi dengan IE 9 beta.
sumber
Artikel microsoft KB berjudul Ketika Anda menggunakan Microsoft Internet Explorer atau program lain untuk melakukan operasi POST ulang, hanya data header yang diposting tampaknya dapat memperbaiki masalah ini.
Artikel ini menyediakan perbaikan terbaru. Untuk browser yang lebih baru seperti IE8 dikatakan hotfix sudah disertakan tetapi perlu diaktifkan melalui pengaturan registri pada PC klien.
sumber
Saya memiliki masalah serupa di mana beberapa versi IE yang lebih lama hanya akan mengirim kembali Header dan bukan badan POST. Masalah saya ternyata terkait dengan IE dan NTLM. Karena Anda tidak menyebutkan NTLM, ini mungkin tidak membantu, tetapi untuk berjaga-jaga:
http://support.microsoft.com/kb/251404
sumber
Ini adalah longshot, tetapi IE (dan bahkan Firefox) terkadang "mengingat" koneksi yang digunakannya untuk permintaan HTTP. Catatan / contoh:
Di Firefox, jika saya mengubah pengaturan proxy dan menekan SHIFT-RELOAD pada halaman, itu masih menggunakan proxy lama. Namun, jika saya mematikan proxy lama ("killall squid"), itu mulai menggunakan proxy baru.
Saat Anda memutuskan / menyambungkan kembali, apakah Anda menerima alamat IP baru atau yang serupa? Dapatkah Anda memonitor alamat IP lama untuk melihat apakah IE mengirimkan data ke alamat yang sekarang sudah mati itu?
Dugaan saya adalah bahwa IE mengirimkan data, di jalur yang salah. Mungkin cukup pintar untuk tidak menyimpan koneksi jaringan ke cache untuk paket "POST", tetapi mungkin tidak cukup pintar untuk melakukannya untuk payload POST.
Ini mungkin tidak memengaruhi sebagian besar aplikasi AJAX, karena orang jarang memutuskan dan menyambungkan kembali jaringan mereka?
sumber
Apakah Anda menggunakan otentikasi NTLM?
Saat menggunakan otentikasi NTLM, IE tidak mengirim data pasca. Ini mengirimkan info header, mengharapkan respons yang tidak sah mengirim otorisasi, dan setelah 'otentikasi ulang' mengirim posting.
sumber
Saya mengalami masalah serupa hari ini ketika menggunakan $ .ajax dan dapat memperbaikinya dengan menyetel async ke false.
sumber