इंटरनेट एक्सप्लोरर विफलता के बाद अजाक्स कॉल पर HTTP पोस्ट बॉडी क्यों नहीं भेजता है?


114

हम निम्नलिखित परिदृश्य को फिर से बनाने में सक्षम हैं:

  1. एक छोटा HTML पृष्ठ बनाएं जो सर्वर से AJAX अनुरोध करता है (HTTP POST का उपयोग करके)
  2. नेटवर्क से डिस्कनेक्ट करें और फिर से कनेक्ट करें
  3. पैकेट पैकेट की निगरानी करें जो IE विफलता के बाद उत्पन्न करता है

असफल नेटवर्क कनेक्शन के बाद, IE अगला AJAX अनुरोध करता है लेकिन केवल HTTP पोस्ट करते समय HTTP हेडर (बॉडी नहीं) भेजता है । यह सर्वर पर सभी प्रकार की समस्याओं का कारण बनता है क्योंकि यह केवल आंशिक अनुरोध है। Google ने बिंग के साथ इस मुद्दे को उठाया और आपको AJAX या अस्पष्टीकृत AJAX विफलताओं का उपयोग करके "यादृच्छिक सर्वर त्रुटियों" के बारे में शिकायत करने वाले बहुत से लोग मिलेंगे।

हम जानते हैं कि IE (अधिकांश अन्य ब्राउज़रों के विपरीत) हमेशा HTTP टीसीएस को दो टीसीपी / आईपी पैकेट के रूप में भेजता है। हेडर और बॉडी को अलग-अलग भेजा जाता है। विफलता के बाद सीधे मामले में, IE केवल हेडर भेजता है । IE कभी भी पेलोड नहीं भेजता है और सर्वर अंततः टाइमआउट के साथ प्रतिक्रिया करता है।

तो मेरा सवाल है - यह इस तरह से व्यवहार क्यों करता है? यह HTTP कल्पना और अन्य ब्राउज़रों के आधार पर गलत लगता है इस तरह से व्यवहार नहीं करते हैं। क्या यह केवल एक बग है? निश्चित रूप से यह किसी भी गंभीर AJAX आधारित वेब एप्लिकेशन में कहर पैदा करता है।

संदर्भ सूचना:

इसी तरह की समस्या है, जो HTTP Keep-live टाइमआउट द्वारा ट्रिगर की गई है जो 1 मिनट से कम है और यहां प्रलेखित है:

http://us.generation-nt.com/xmlhttprequest-post-sometimes-fails-when-server-using-keep-aliv-help-188813541.html

http://support.microsoft.com/default.aspx?kbid=831167


6
यह एक उत्कृष्ट, अच्छी तरह से परिभाषित प्रश्न है जो एक उत्तर का हकदार है। दुर्भाग्य से, यह एक छोटा विषय है। मुझे यकीन नहीं है कि यह webmasters.stackexchange.com या superuser.stackexchange.com पर बेहतर होगा ।
स्टीफन

3
@ gilly3, मुझे लगता है कि मेरे साथ कुछ गलत होना चाहिए, क्योंकि मैंने पढ़ा था कि और साथ में सिर हिला रहा था ...
Ryley

1
@ gilly3: जब डच में अनुवाद किया जाता है तो यह सही होगा, क्योंकि 'googelen' एक क्रिया है (डच डिक्शनरी में भी परिभाषित) जिसका अर्थ है 'डच में वेब की खोज'। हां, यह 'googelen' है और 'googlen' नहीं है। अजीब है, मुझे पता है। तो, आप बस कह सकते हैं: 'गोगेल डिट प्रॉब्लम बिंग से मुलाकात की।' और यह सही होगा।

11
@ gilly3: बिंग क्या है? मैं गूगल कर रहा हूँ।
रॉकेट हज़मत

5
"यह इस तरह से व्यवहार क्यों करता है?" - क्या आप एक उत्तर के लिए स्वीकार करेंगे "Microsoft लोग, हालांकि अधिकांश भाग के लिए प्रतिभाशाली, प्रोग्रामिंग प्रोग्रामिंग संस्कृति का एक हिस्सा हैं जो हम में से उन लोगों से अलग हैं जो डीईसी, यूनिक्स, ऐप्पल, कमोडोर, या अन्य पृष्ठभूमि के माध्यम से डिजिटल युग में आए थे, और उन चीजों को करने के लिए करते हैं, जो हममें से बाकी लोगों को आश्चर्य में डाल देती हैं, न कि उनकी प्रतिभा पर, बल्कि उनके अतिसक्रियता और उन चीजों के कुल भ्रष्टाचार पर, जो हम में से बाकी लोगों के लिए सरल और सीधे हैं "?
jcomeau_ictx

जवाबों:


28

इस सवाल का कोई स्पष्ट जवाब नहीं लगता है, इसलिए मैं एक विकल्प के रूप में अपने अनुभवजन्य डेटा प्रदान करूंगा और इसके आसपास काम करने के कुछ तरीके प्रदान करूंगा। शायद कुछ एमएस इनसाइडर एक दिन इस पर कुछ प्रकाश डालेंगे ...

  1. यदि HTTP कीप-अलाइव सर्वर पर अक्षम है, तो यह समस्या दूर हो जाती है। दूसरे शब्दों में, आपका HTTP 1.1 सर्वर Connection: Closeप्रतिक्रिया में एक लाइन के साथ हर अजाक्स अनुरोध का जवाब देगा। यह IE को खुश रखता है लेकिन नए कनेक्शन को खोलने के लिए हर अजाक्स अनुरोध का कारण बनता है। यह विशेष रूप से उच्च विलंबता नेटवर्क पर एक महत्वपूर्ण प्रदर्शन प्रभाव डाल सकता है।

  2. यदि अजाक्स अनुरोध तेजी से उत्तराधिकार में किया जाता है तो यह मुद्दा आसानी से शुरू हो जाता है। उदाहरण के लिए, हम प्रत्येक 100ms में अजाक्स अनुरोध करते हैं और फिर नेटवर्क की स्थिति बदल जाती है, त्रुटि को पुन: पेश करना आसान है। हालाँकि अधिकांश एप्लिकेशन संभवतः इस तरह के अनुरोध नहीं करते हैं, लेकिन आप एक दूसरे के ठीक बाद होने वाले सर्वर कॉल को अच्छी तरह से कर सकते हैं जिससे यह समस्या हो सकती है। कम चैटिंग IE को खुश रखता है।

  3. यह NTLM प्रमाणीकरण के बिना भी होता है।

  4. यह तब होता है जब सर्वर पर आपका HTTP Keep-live टाइमआउट डिफ़ॉल्ट से छोटा होता है (जो विंडोज पर 60 सेकंड तक डिफॉल्ट करता है)। विचाराधीन लिंक में दिए गए विवरण।

  5. यह क्रोम या फ़ायरफ़ॉक्स के साथ नहीं होता है। एफएफ एक पैकेट भेजता है ताकि लगता है कि इस मुद्दे से पूरी तरह से बचें।

  6. यह IE 6, 7, 8 में होता है। IE 9 बीटा के साथ पुन: पेश नहीं किया जा सकता है।


4
क्या इस समस्या को ठीक करने के अन्य तरीके हैं? कोई जावास्क्रिप्ट ठीक? मैंने विभिन्न XMLHTTP ऑब्जेक्ट्स को देखने का प्रयास किया और उन्होंने अभी भी समस्या को ठीक नहीं किया।
बर्लिन ब्राउन

11

जब आप Microsoft इंटरनेट एक्सप्लोरर या किसी अन्य प्रोग्राम का पुनः-पोस्ट ऑपरेशन करने के लिए उपयोग करते हैं, तो Microsoft KB आलेख शीर्षक , केवल शीर्ष लेख डेटा पोस्ट किया जाता है जो इस समस्या को ठीक करने के लिए लगता है।

आलेख एक हॉटफ़िक्स प्रदान करता है। IE8 जैसे बाद के ब्राउज़रों के लिए यह कहता है कि हॉटफ़िक्स पहले से ही शामिल है, लेकिन क्लाइंट पीसी पर रजिस्ट्री सेटिंग्स के माध्यम से सक्षम करने की आवश्यकता है


1
मैं IE10 के साथ इस समस्या का सामना कर रहा हूँ, जिसका लेख में उल्लेख नहीं है।
ClearCloud8

6
लेख में अब IE11 तक का उल्लेख है, इसलिए ऐसा लगता है कि यह कभी भी तय नहीं था।
षोडश

मुझे विश्वास है कि मैं एक उत्पादन साइट पर इस मुद्दे का अनुभव कर रहा हूं - इस मुद्दे से जुड़े उपयोगकर्ता एजेंट IE 8,9,10 और 11. के साथ मेल
खाते हैं

क्या किसी ने वर्कअराउंड पाया है? विशेष रूप से मैं एक 307 और एफएफ, क्रोम भेजता हूं, सफारी नए एंडपॉइंट के डेटा को रीपोस्ट करता है - आईई नहीं करता है। मैं अपने उपयोगकर्ताओं से हॉटफ़िक्स / रजिस्ट्री पैच के लिए नहीं कह सकता।
ब्राड गुन

2

मुझे इसी तरह की समस्या थी जहां IE के कुछ पुराने संस्करण केवल हैडर को वापस भेजेंगे, न कि एक POST के शरीर को। मेरी समस्या IE और NTLM से संबंधित है। चूंकि आपने NTLM का उल्लेख नहीं किया है, इसलिए यह संभवत: मदद नहीं करता है, लेकिन सिर्फ मामले में:

http://support.microsoft.com/kb/251404


आपका लिंक IE 11 और IIS 6. में इसी तरह की समस्या को हल करने में मददगार था
हरमिंदर

1

यह एक लॉन्गशॉट है, लेकिन IE (और यहां तक ​​कि फ़ायरफ़ॉक्स) कभी-कभी एक HTTP अनुरोध के लिए उपयोग किए जाने वाले कनेक्शन को "याद" करता है। नोट / उदाहरण:

  • फ़ायरफ़ॉक्स में, अगर मैं प्रॉक्सी सेटिंग्स को बदलता हूं और किसी पृष्ठ पर SHIFT-RELOAD को हिट करता हूं, तो यह अभी भी पुराने प्रॉक्सी का उपयोग करता है। हालांकि, अगर मैं पुराने प्रॉक्सी ("किलॉल स्क्वीड") को मारता हूं, तो यह नए प्रॉक्सी का उपयोग करना शुरू कर देता है।

  • जब आप डिस्कनेक्ट / पुनः कनेक्ट करते हैं, तो क्या आपको एक नया आईपी पता या कुछ समान मिलता है? क्या आप किसी तरह पुराने आईपी पते की निगरानी कर सकते हैं कि क्या IE उस अब-मृत पते पर डेटा भेज रहा है?

  • मेरा अनुमान है कि IE डेटा भेज रहा है, गलत रास्ते से नीचे। यह "POST" पैकेट के लिए नेटवर्क कनेक्शन को कैश नहीं करने के लिए पर्याप्त स्मार्ट हो सकता है, लेकिन हो सकता है कि यह POST लोड के लिए पर्याप्त स्मार्ट न हो।

  • यह शायद सबसे AJAX ऐप्स को प्रभावित नहीं करता है, क्योंकि लोग शायद ही कभी अपने नेटवर्क से डिस्कनेक्ट और री-कनेक्ट करते हैं?


2
मुझे लगता है कि समस्या अंतिम है। मुझे लगता है कि Microsoft "शायद ही कभी होता है: लागू न करें" -policy का उपयोग करता है। :)

1
मैं स्रोत से गंतव्य तक सभी HTTP ट्रैफ़िक की निगरानी करता हूं। मैं इस बात की पुष्टि कर सकता हूं कि (ए) मेरा आईपी पता नहीं बदला और (बी) कुछ और भेजने की कोशिश नहीं की गई है। IE एक नया सॉकेट खोलता है और एक आंशिक अनुरोध भेजता है। जिस तरह से मैंने एमएस लेख पढ़ा, उनके सुरक्षा अद्यतन में से एक है IE। फिर उन्होंने इसे ठीक करने के लिए एक पैच बनाया। लेकिन अगर आप चाहते थे कि यह पुराने "टूटे" तरीके से व्यवहार करे, तो आप इस रजिस्ट्री कुंजी को जोड़ सकते हैं। Retry_HeaderOnlyPOST_OnConnectionReset। सिर्फ पागलपन का बोध कराने की कोशिश कर रहा है।
डोडिग्रबिट

अपने अंतिम बिंदु पर: यदि आपके पास समय-समय पर सर्वेक्षण करने वाला अजाक्स ऐप है, तो 10 सेकंड कहें, हम पाते हैं कि यदि कुछ घंटों के लिए खुला छोड़ दिया जाए तो यह त्रुटि हमेशा के लिए हो जाएगी। संभवतः वाईफ़ाई कनेक्शन जो ड्रॉप या स्केच नेटवर्क - लेकिन हमारा अनुभव यह समस्या बहुत वास्तविक है।
डोडिग्रैबिट

1

क्या आप NTLM प्रमाणीकरण का उपयोग कर रहे हैं?

NTLM प्रमाणीकरण का उपयोग करते समय, IE पोस्ट-डेटा नहीं भेजता है। यह शीर्ष लेख की जानकारी भेजता है, एक अनधिकृत प्रतिक्रिया को प्राधिकरण भेजने की उम्मीद करता है, और 'पुनः प्रमाणीकरण' के बाद पोस्ट भेजता है।


हम NTLM प्रमाणीकरण का उपयोग नहीं करते हैं। अनाम अनुरोधों के साथ होता है।
डोडेयॉर्बिट

0

$ .Ajax का उपयोग करते समय मुझे आज भी ऐसी ही समस्या थी और यह async को झूठी स्थापित करके इसे ठीक करने में सक्षम था।

$.ajax({
  async: false, 
  url: '[post action url]',
  data: $form.serialize(),
  type: 'POST',
  success: successCallback
});

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.