मैंने हाल ही में पाया है कि इंटरनेट एक्सप्लोरर का उपयोग कर मेरे एप्लिकेशन चलाने वाले उपयोगकर्ताओं के लिए अंतःक्रिया विफलताओं की समस्या इंटरनेट एक्सप्लोरर में एक बग के कारण है। बग HTTP स्टैक में है, और आईई से POST अनुरोधों का उपयोग कर सभी अनुप्रयोगों को प्रभावित करना चाहिए। परिणाम एक अनुरोध द्वारा विशेषता विफलता है जो लगभग 5 मिनट (सर्वर प्रकार और कॉन्फ़िगरेशन के आधार पर) के लिए लटकती प्रतीत होती है, फिर सर्वर अंत से विफल हो जाती है। सर्वर छोड़ने के बाद ब्राउज़र एप्लिकेशन पोस्ट अनुरोध से चूक जाएगा। मैं आईई बग को नीचे विस्तार से समझाऊंगा।क्या AJAX अनुप्रयोग जो POST अनुरोधों का उपयोग करते हैं हमेशा इंटरनेट एक्सप्लोरर में विफल हो जाते हैं?
जहां तक मैं यह कह सकता हूं कि सर्वर पर POST अनुरोध भेजने के लिए XMLHttpRequest का उपयोग करके किसी भी एप्लिकेशन के साथ होगा, अगर अनुरोध गलत पल पर भेजा जाता है। मैंने एक नमूना कार्यक्रम लिखा है जो केवल उन समय POSTS भेजने का प्रयास करता है। यह सर्वर को कनेक्शन को बंद करने के सटीक पल पर सर्वर पर निरंतर POSTs भेजने का प्रयास करता है। अंतराल सर्वर द्वारा भेजे गए Keep-Alive शीर्षलेख से लिया गया है।
मुझे लगता है कि आईई से थोड़ी देर के विलंब के साथ सर्वर पर चलने पर (यानी एक ही लैन पर नहीं), समस्या केवल कुछ पोस्ट के बाद होती है। जब ऐसा होता है, तो आईई इतनी मेहनत कर देता है कि इसे बल बंद करना होगा। टिकिंग घड़ी एक संकेत है कि ब्राउज़र अभी भी प्रतिक्रिया दे रहा है।
आप इसे ब्राउज़ करके इसे आजमा सकते हैं: http://pubdev.hitech.com/test.post.php। कृपया ध्यान रखें कि आपके द्वारा चलाए जाने पर किसी भी आईई सत्र में आपके पास कोई भी महत्वपूर्ण सहेजी गई जानकारी नहीं है, क्योंकि मुझे लगता है कि यह आईई को क्रैश करेगा।
पूर्ण स्रोत को पुनर्प्राप्त किया जा सकता है: http://pubdev.hitech.com/test.post.php.txt। आप इसे किसी भी सर्वर पर चला सकते हैं जिसमें php है और लगातार कनेक्शन के लिए कॉन्फ़िगर किया गया है।
मेरे प्रश्न हैं:
इस मुद्दे के साथ अन्य लोगों के अनुभवों को क्या हैं?
क्या इस समस्या के आसपास काम करने के लिए कोई ज्ञात रणनीति है ("किसी अन्य ब्राउज़र का उपयोग करें")?
क्या माइक्रोसॉफ्ट के पास इस आलेख के बारे में बेहतर जानकारी है जो मैंने पाया है (नीचे देखें)?
समस्या यह है कि वेब ब्राउज़र और डिफ़ॉल्ट उपयोग लगातार कनेक्शन द्वारा सर्वर (http://www.ietf.org/rfc/rfc2616.txt देखें) RFC 2616 खंड 8.1 में वर्णित है। यह प्रदर्शन के लिए बहुत महत्वपूर्ण है - खासकर AJAX अनुप्रयोगों के लिए - और इसे अक्षम नहीं किया जाना चाहिए। हालांकि एक छोटा समय छेद है जहां ब्राउज़र पहले से इस्तेमाल किए गए कनेक्शन पर एक पोस्ट भेजने शुरू कर सकता है, साथ ही सर्वर कनेक्शन को निष्क्रिय करता है और इसे बंद करने का निर्णय लेता है। नतीजा यह है कि ब्राउज़र के HTTP स्टैक को सॉकेट त्रुटि मिलेगी क्योंकि यह बंद सॉकेट का उपयोग कर रही है। आरएफसी 2616 सेक्शन 8.1.4 इस स्थिति की उम्मीद करता है, और कहता है, "... क्लाइंट, सर्वर, और प्रॉक्सी असीमित बंद घटनाओं से पुनर्प्राप्त करने में सक्षम होना चाहिए। क्लाइंट सॉफ़्टवेयर को परिवहन कनेक्शन को फिर से खोलना चाहिए और उपयोगकर्ता इंटरैक्शन के बिना अनुरोधों के निरस्त अनुक्रम को पुनः प्रेषित करना चाहिए ... "
इंटरनेट एक्सप्लोरर ऐसा होता है जब पोस्ट होता है, लेकिन जब यह अनुरोध को उलझता है। यह पोस्ट हेडर भेजता है, जिसमें पोस्ट की गई डेटा की सामग्री-लंबाई शामिल है, लेकिन यह डेटा नहीं भेजता है। यह एक अनुचित अनुरोध है, और सर्वर त्रुटि के अनुरोध में विफल होने से पहले वादा किए गए डेटा के लिए अनिर्दिष्ट समय का इंतजार करेगा। मैं इस विफलता को एक सी प्रोग्राम का उपयोग करके 100% समय का प्रदर्शन करने में सक्षम हूं जो HTTP सर्वर को अनुकरण करता है, जो प्रतिक्रिया भेजने के बिना किसी आने वाले POST अनुरोध की सॉकेट को बंद करता है।
माइक्रोसॉफ्ट http://support.microsoft.com/kb/895954 में इस विफलता को स्वीकार करता है। वे कहते हैं कि यह आईई संस्करण प्रभावित करता है 9. यही कारण है कि इस समस्या यह है कि IE के सभी संस्करणों के साथ आईई 7 के बाद से भेज दिया गया है के लिए एक हॉटफिक्स उपलब्ध कराने हॉटफिक्स निम्नलिखित कारणों के लिए संतोषजनक नहीं लगता है के माध्यम से 6:
यह तब तक सक्षम नहीं है जब तक आप रजिस्ट्री में FEATURE_SKIP_POST_RETRY_ON_INTERNETWRITEFILE_KB895954 नामक कुंजी जोड़ने के लिए regedit का उपयोग न करें। यह ऐसा कुछ नहीं है जिसे मैं अपने उपयोगकर्ताओं को करना चाहता हूं।
हॉटफिक्स वास्तव में टूटी हुई पोस्ट को ठीक नहीं करता है। इसके बजाए, अगर आरएफसी द्वारा अनुमानित सॉकेट बंद हो जाता है, तो यह पोस्ट को नाराज करने की कोशिश किए बिना तुरंत त्रुटिपूर्ण हो जाता है। एप्लिकेशन अभी भी विफल रहता है - यह जल्द ही विफल हो जाता है।
निम्नलिखित उदाहरण एक स्वयं निहित PHP प्रोग्राम है जो बग को प्रदर्शित करता है। यह सर्वर को कनेक्शन को बंद करने के सटीक पल पर सर्वर पर निरंतर POSTs भेजने का प्रयास करता है। अंतराल सर्वर द्वारा भेजे गए Keep-Alive शीर्षलेख से लिया गया है।
क्या आपने कभी इस के आसपास एक रास्ता खोजा है? मैं jQuery AJAX पोस्ट ऑपरेशंस का उपयोग कर एक ही समस्या का सामना कर रहा हूँ। – ClearCloud8
@ टोनी-एबो मैं इसी तरह की समस्या में भाग रहा हूं। जानना उत्सुक है कि इसके लिए कोई फिक्स है या नहीं? जीईटी अनुरोध के लिए ऐसा क्यों नहीं होता है? क्या ऐसा इसलिए है क्योंकि जीईटी में कोई शरीर नहीं है और इसलिए नेटवर्क विफलता पर पुनर्वित्त सफल है? –