2009-10-02 6 views
7

यहाँ सार है:मैं एएसपी क्लासिक में एसिंक्रोनस कॉल कैसे आग लगा सकता हूं और प्रतिक्रिया को अनदेखा कर सकता हूं?

मैं एक कॉल मैं एएसपी में बनाना चाहते है, और मुझे प्रतिक्रिया के बारे में परवाह नहीं है। मैं बस कॉल को आग लगाना चाहता हूं और मैं नहीं चाहता कि पेज प्रतिक्रिया के लिए प्रतीक्षा करे। प्रलेखन के अनुसार, यह कुछ इस तरह दिखना चाहिए:

dim xmlhttp : set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP") 
xmlhttp.Open "POST", url, true '' setting the 'asynchronous' option to 'true' 
xmlhttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8" 
xmlhttp.setRequestHeader "Content-Length", Len(XMLData) 
xmlhttp.send XMLData 

यह आड़ू का काम करता है जब तुल्यकालिक बुला, लेकिन जब मैं 'सही', कुछ भी करने के लिए आग ansynchronous विकल्प फ्लिप।

While xmlhttp.readyState <> 4 
    xmlhttp.waitForResponse 1000 
Wend 

मुझे लगता है कि में पागल हूँ यह वास्तव में एक asynchrous कॉल की तरह प्रतीत नहीं होता है अब हालांकि यदि आप एक प्रतिक्रिया के लिए इंतजार कर रहे हैं: क्या मैं इंटरनेट से इकट्ठा कर सकते हैं कि उपयोगकर्ताओं को निम्नलिखित की तरह कुछ करना है?

सही भेजने के बाद लाइन xmlhttp.waitForResponse 1 डाल आग अनुरोध का कारण होगा, लेकिन फिर से, मैं एक दूसरे प्रतीक्षा करने के लिए नहीं करना चाहती।

किसी भी विचार?

उत्तर

7

मुख्य समस्या यह है यहाँ अगर आप इंतजार नहीं करते हैं और अपनी स्क्रिप्ट समाप्त होता है ServerXMLHTTP घटक ही नष्ट कर देता है और इस प्रक्रिया में लंबित अनुरोध रोकता है। इस बात की गारंटी देने का कोई तरीका नहीं है कि उस समय अनुरोध कहां मिल गया है।

उदाहरण के लिए यदि आपके सर्वर दौर गंतव्य सर्वर के साथ जारी करने के लिए नहीं मिला है वह अपने अब जरूरत और परेशान नहीं है कि देखेंगे।

भले ही गंतव्य सर्वर पर कोई कनेक्शन बनाया गया हो, अनुरोध अभी तक हैंडलर को नहीं दिया गया है। प्रायः एक वेब सर्वर जांच करेगा कि अनुरोध पूरा करने के लिए संसाधनों को करने से पहले क्लाइंट अभी भी जुड़ा हुआ है। अगर ऐसा लगता है कि आपका कनेक्शन गिरा दिया गया है तो यह अनुरोध को पूरा करने से परेशान नहीं होगा।

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

3

हम async XMLRequest का उपयोग हमारे एएसपी साइटों में FogBugz में त्रुटियों लॉग इन करें। इसकी एक त्रुटि रिपोर्ट के रूप में हम नहीं चाहते हैं कि हमारे उपयोगकर्ता हमारे कोड को समाप्त करने के लिए इंतजार कर रहे हों ताकि हम इसे एसिंक कर सकें। यह किसी अनुपलब्ध कॉन्फ़िगरेशन फ़ाइल, डीबी टाइमआउट, कहीं भी कॉन्फ़िगरेशन फ़ाइल में लापता लुकअप से कुछ भी हो सकता है, आदि हमेशा मिशन क्रिटिकल सामान नहीं बल्कि इसके बारे में जानना अच्छा होता है। उन मामलों में एसिंक एक इलाज करता है और यदि नहीं तो यह हमारे लिए दुनिया का अंत नहीं है लेकिन हमें इसके साथ कोई समस्या नहीं है।

System.Net.HttpWebRequest in classic asp?

तरह एंथनी कहते हैं हालांकि इसके 100% guanenteed के माध्यम से प्राप्त करने के लिए: हम इस स्क्रिप्ट जो हम बना सकते हैं और एक और सवाल में तैनात उपयोग कर रहे हैं। एक संभावित फिक्स के रूप में आप Response.Buffer = true डाल सकते हैं, उपयोगकर्ता को अपने सभी आउटपुट प्रस्तुत कर सकते हैं, Response.Flush पर कॉल करें और फिर प्रतीक्षा करेंForResponse कॉल करें। उपयोगकर्ता पूरे पृष्ठ को देखेगा और बिना किसी पकड़ के इसके साथ बातचीत करने में सक्षम होगा और यह आपके एसिंक कॉल को समाप्त करने के लिए थोड़ा और समय देता है।

12

आज मुझे एक ही समस्या मिली। मैंने इसे "माइक्रोसॉफ्ट.एक्सएमएलटीटीपी" ऑब्जेक्ट का उपयोग करके हल किया।

dim xmlhttp 
set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP") 
xmlhttp.Open "POST", url, true 
xmlhttp.Send "" 

और अब अनुरोध अतुल्यकालिक रूप से भेजा गया है और लक्षित यूआरएल मारा गया था। उम्मीद है कि मदद करता है।

+0

उत्कृष्ट - धन्यवाद! – EdenMachine

+0

आपने मुझे कीबोर्ड के खिलाफ अपने सिर को तेज़ करके मृत्यु से बचाया है। ऐसा लगता है कि "MSXML2.ServerXMLHTTP" के लिए यह प्रत्यक्ष प्रतिस्थापन (कोई रिफैक्टरिंग आवश्यक नहीं है?) - लेकिन यह सुनिश्चित करने के लिए मैं केवल रिग्रेशन चला रहा हूं। – jerhewet

2

एक और विकल्प यदि आप अभी भी ServerXMLHTTP ऑब्जेक्ट का उपयोग करना चाहते हैं (और एंटोन द्वारा ऊपर उल्लिखित क्लाइंट-साइड घटक नहीं है तो http://support.microsoft.com/kb/290761 पर अक्सर पूछे जाने वाले प्रश्न # 4) VBScript क्लास बनाना है। कक्षा को तत्काल करें। क्लास की संपत्ति को HTTP ऑब्जेक्ट पर सेट करें। फिर अनुरोध को बंद करने के लिए एक विधि को कॉल करें।

क्लास इंस्टेंस को कभी भी नष्ट न करें - एएसपी पृष्ठ समाप्त होने पर यह स्वचालित रूप से नष्ट हो जाएगा। क्लास विनाश विधि HTTP ऑब्जेक्ट को मुक्त करें - इसे नष्ट होने से पहले अनुरोध को बंद करने के लिए पर्याप्त समय देना चाहिए।

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

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