2012-10-01 20 views
11

पर मेरे पास एक साइट है जिसे मैं उपयोगकर्ता नाम/पासवर्ड दर्ज करता हूं और लॉगिन बटन पर क्लिक करता हूं। लॉगिन बटन एक XMLHttpRequest ऑब्जेक्ट बनाता है, और इसे बंद कर देता है।पहला XMLHttpRequest विफल रहता है लेकिन केवल IE9

क्रोम, फ़ायरफ़ॉक्स, ओपेरा, सफारी, एंड्रॉइड डिवाइस, आईओएस डिवाइस पर यह ठीक काम करता है। आईई 9 तब तक काम करेगा जब तक मैं एक HTTP पते पर हूं और HTTPS का उपयोग नहीं कर रहा हूं।

HTTPS पर, IE9 प्रकार कार्य करता है:

पहले लॉगिन अनुरोध कुछ भी रिटर्न वापस कभी नहीं। एफ 12 स्क्रीन नेटवर्क टैब में मेरा लॉगिन अनुरोध दिखाती है और सभी सही दिखते हैं। स्क्रिप्टिंग टैब कभी भी त्रुटि नहीं फेंकता है। बस कुछ भी नहीं होता है।

यहां पागल हिस्सा है: - यदि मैं दूसरी बार लॉगिन पर क्लिक करता हूं, तो यह वास्तव में काम करता है। - यदि मैं ब्राउज़र पर रीफ्रेश क्लिक करता हूं, और फिर लॉगिन करता हूं, तो यह भी काम करेगा!

मैं इस प्रकार अनुरोध करने वाले कर रहा हूँ:

var x = new XMLHttpRequest(); 
    x.open("POST", "/Relative/URL/Path", true); 
    x.setRequestHeader("Content-Type", "text/plain"); 
    x.onreadystatechange = function() { 
     if ((x.readyState == 4) && (x.status == 200)) { 
      // handle callback 
     } 
    } 
    x.send(my request); 

जब यह विफल रहता है, डिबगर onreadystatechange कोड में x.send() लाइन से जाना जाएगा। तैयार चरण 1 होगा। यह अंतिम होगा जो मैं डीबग कर सकता हूं क्योंकि कुछ और नहीं होता है।

किसी भी विचार की अत्यधिक सराहना की जाएगी।

[संपादित करें]: मैंने यह देखने के लिए एक अनुरोध किया कि क्या होगा। Onreadystatechange घटना को फिर से तैयार = 4 और स्थिति = 12152 के साथ निकाल दिया गया। आईई 9 की एफ 12 स्क्रीन में नेटवर्क व्यू परिणाम को निरस्त और 1589.07 के रूप में लिया गया परिणाम दिखाता है। एक Google खोज से पता चलता है कि सर्वर पर कनेक्शन बंद था।

[संपादित करें 2]: नीचे दी गई टिप्पणी के आधार पर मैंने jQuery के AJAX() विधि का उपयोग करने के लिए इस कोड को redid। मैंने सोचा कि यह मेरे हिस्से पर खराब कोड को खत्म करने का मौका हो सकता है। ऐसा भाग्य नहीं। वही व्यवहार होता है।

$.ajax({ 
     "url": sUrl, 
     "success": function (data, textStatus, x) { 
     workerCallback(data, id, ""); 
     }, 
     "error": function (x, testStatus, errorThrown) { 
     workerCallback("nc", id, errorThrown); 
     }, 
     "contentType": "text/plain", 
     "data": JSON.stringify(req), 
     "dataType": "json", 
     "timeout": 1600000, 
     "type": "POST" 
    }); 

[अंतिम अपडेट:] मैंने कोड अपडेट किया है। यदि कोई टाइमआउट होता है, तो मैं केवल उसी अनुरोध को दोबारा दोहराता हूं - केवल एक बार। काफी हैक लेकिन यह काम करता है। जब तक कोई भी समाधान नहीं ढूंढ लेता है, तब तक मैं कुछ उपयोगी विचारों के बीच बक्षीस को विभाजित करूंगा जो लोग नीचे थे।

+0

कैश साफ़ है? क्या आप फिडलर जैसे कुछ भी इस्तेमाल करते हैं यह देखने के लिए कि क्या अनुरोध बाहर निकले हैं? – epascarello

+0

कैश साफ़ है। अनुरोधों की निगरानी पर महान सुझाव। मैंने वायरशर्क (नेटवर्क स्निफ़ेर) खोला और चेक किया। जब मैं पहली बार लॉगिन करता हूं तो मैं कुछ भी नहीं देख सकता। दूसरी बार मैं अनुरोध देखता हूं! लेकिन आईई का कहना है कि यह अनुरोध किया ?! – Paul

+0

त्रुटि कोड देखें: http://support.microsoft.com/kb/193625 – epascarello

उत्तर

0

पहले अनुरोध पर डिबग के दौरान इस

enter image description here

इस सटीक त्रुटि के एक संबंधित पोस्ट नहीं है के माध्यम से आया ... IE 9 Javascript error c00c023f

लेखक onreadystatechange हैंडलर

में निम्नलिखित डाल
if (xmlHttpRequest.aborted==true) { 
    stopLoadAnimation(); 
    return; 
} 

यह आपको सही दिशा में इंगित करने में मदद कर सकता है।

+0

देखने के लिए धन्यवाद, हालांकि त्रुटि वास्तव में एक त्रुटि नहीं है। आपने पहली बार तैयार चरण सेट अप किया है। इस मामले में यह 1 पर सेट है क्योंकि यह कॉल करने वाला है। स्थिति संपत्ति सेट नहीं की जाएगी, इस प्रकार यह देखने का प्रयास कर रहा है कि डीबगर में त्रुटि होगी। मेरा कोड तैयार राज्य के लिए जांचता है और केवल तब तक पहुंच स्थिति है और कोई त्रुटि नहीं फेंकता है। – Paul

1

यह एक अजीब समस्या की तरह लगता है और किसी https साइट पर कोड के चारों ओर पोक किए बिना इसका परीक्षण करना मुश्किल है।

यदि आप एक त्वरित फिक्स चाहते हैं तो आप प्रारंभिक (डमी) अनुरोध करने का प्रयास कर सकते हैं, फिर इसे तुरंत एक छोटा सेट टाइमआउट के साथ निरस्त कर दें और दूसरा (वास्तविक) अनुरोध करें।

आपके विवरण के अनुसार इसे काम करना चाहिए।

+0

आप कोड के चारों ओर पोक कर सकते हैं। मैंने इसे सब कुछ बक्षीस विवरण में लिंक में पोस्ट किया। – Paul

+0

हालांकि यह काफी हैक है, मैंने आपकी टिप्पणी और एक दूसरे के आधार पर कोड अपडेट किया है। अब यदि कोई टाइमआउट होता है, तो मैं अनुरोध दोहराता हूं - केवल एक बार। तो आईई अब लॉग इन करने में काफी देर हो रही है, हालांकि यह अंत में काम करेगा। अगर किसी के पास सही जवाब नहीं है, तो मैं आपके और एक दूसरे के बीच बक्षीस को विभाजित कर दूंगा। – Paul

+0

हां लेकिन मेरे पास इसका परीक्षण करने के लिए कोई https सर्वर नहीं है। आपको आईई को एक लंबी देरी नहीं देनी है। पहले एक त्वरित अनुरोध रद्द करें और तुरंत एक और करें, और यह हर जगह तेजी से होना चाहिए। – galambalazs

0
  • Timeouts readyState 1 पर समाप्त किया जा रहा से अनुरोध रोकता है, और यह सामग्री सूंघने की वजह से बाद में सफल होता है।

  • वेब सर्वर config

  • सम्मिलित (जैसे एक छवि के रूप में) एक छिपा तत्व का उपयोग लॉगिन फार्म पर कॉन्फ़िगर SSL क्लाइंट प्रमाणीकरण एक यूआरएल का संदर्भ देता है SSL क्लाइंट प्रमाणीकरण की आवश्यकता है कि एक प्रोटोकॉल

  • उपयोग रिश्तेदार gif हाइपरलिंक, जैसे //example.com/image.gif, से बचने के लिए SEC7111 mixed content vulnerability

  • जब HTTP का उपयोग कर open method का URL डोमेन से मेल खाता है, लेकिन नहीं HTTPS, जो करने के लिए अनुरोध का कारण बनता है असफल, लेकिन बाद में अनुरोध security zone policy

  • पर वापस आने स्क्रिप्ट पेज

  • JSON MIME प्रकार के रूप में भेजा जा रहा है के रूप में एक ही संदर्भ में क्रियान्वित किया गया है या जांच करने के लिए window.location.protocol और document.location.protocol के बीच तुलना का उपयोग करें text/plaincontent sniffing

    गति प्रदान कर सकते
  • अनुरोध करता है कि उन है कि सफल होने के

  • 0 बनाम असफल के बीच Accept header की तुलना करेंएक मुद्दा

  • Connection header स्थापित किया जाना

  • Proxy विन्यास एक मुद्दा हो सकता

  • initial header प्रतिक्रिया मान बहुत बड़ा हो सकता की आवश्यकता हो सकती हो सकता है (उदाहरण के लिए HTTP स्थिति विवरण 512 वर्ण की सीमा) है

  • document.readystate प्रारंभिक अनुरोध है, जो premature execution समस्याओं

  • Certificate revocation checks प्रारंभिक JSON पोस्ट ब्लॉक कर सकते हैं, लेकिन अनुमति देने के प्राप्त कॉलबैक के बाद अनुवर्ती अनुरोधों का कारण बनता है पर पूरा नहीं किया जा सकता

:

  • readyState और स्थिति गुण बंद गुंजाइश का उपयोग कर से बचने के लिए callback scope बल्कि चर x से का उपयोग कर संदर्भित किया जाना चाहिए

     
    
        function cb() 
         { 
         if ((this.readyState === 4) && (this.status === 200)) 
         { 
         // handle callback 
         } 
         } 
    
        onreadystatechange = cb; 
    
  • +0

    - मैं पहले से ही एक रिश्तेदार हाइपरलिंक का उपयोग कर रहा हूं। मुझे केवल एक बार जीआईएफ मुद्दा मिला। - खुला यूआरएल सापेक्ष है, इसलिए इसे https डोमेन से मेल खाना चाहिए। मैंने https पर इंगित पूर्ण यूआरएल का भी उपयोग किया है और यह अभी भी विफल रहता है। - जब यह विफल हो जाता है, document.location.protocol और window.location.protocal पूरी तरह से https: के रूप में मेल खाता है। - मैंने "एप्लिकेशन/जेसन" के रूप में भेजने की कोशिश की लेकिन इसका कोई प्रभाव नहीं पड़ा। - एक बार जब मैंने कोड को $ .ajax() पर स्विच किया, तो 'x' पर कोई भी संदर्भ नहीं था जिसे 'इस' पर स्विच किया जाना आवश्यक था। मैंने इसे दूसरे दिन बदल दिया। – Paul

    +0

    @ पॉल स्वेटे - 'x' से' इस' को स्विच करने से कोई चीज़ नहीं बदलेगी क्योंकि वे एक ही चीज़ को संदर्भित करते हैं। यहां कोई उछाल नहीं है क्योंकि यह एक * 'फंक्शन एक्स्प्रेशन '* नहीं है * एक' फंक्शन डिसक्लेरेशन '*, मुझे नहीं लगता कि आपके पास थोड़ा सा विचार है कि आप किस बारे में बात कर रहे हैं। देखें: http://kangax.github.com/nfe/ – galambalazs

    +0

    सबमिट फ़ॉर्म के अंदर सबमिट बटन है? यदि ऐसा है, तो [रेस हालत] हो सकती है (http://stackoverflow.com/questions/11449515/) या एक समस्याग्रस्त [एक्शन विशेषता] (http://stackoverflow.com/questions/1131781/)। –

    संबंधित मुद्दे