2009-12-21 18 views
5

मेरे पास एक वेब एप्लिकेशन है जो वेब सेवाओं पर भारी निर्भर करता है। सेवाओं के साथ सब कुछ असीमित रूप से किया जाता है और AddOnPreRequestHandlerExecuteAsync के साथ किया जाता है। वैसे भी, मेरी अधिकांश कॉल ठीक काम करती हैं, लेकिन कुछ अपनी एसिंक्रोनस सेवा कॉल से वापस आ रहे हैं ताकि एक null httpContext.Current.Response/endprerequest में अनुरोध ऑब्जेक्ट को ढूंढने के लिए, जो निश्चित रूप से तुरंत उपयोग करने का प्रयास करता है। दोनों ऑब्जेक्ट्स (प्रतिक्रिया और अनुरोध कॉल विफल होने की शुरुआत की शुरुआत में उपलब्ध नहीं हैं और अन्य कॉल के अंत में अनुरोध में काम नहीं करते हैं)।असिंक्रोनस HttpWebRequests और एक शून्य HttpContext.Current.Response/अनुरोध ऑब्जेक्ट

कोई भी समान में चलता है, या अनुमान है कि समस्या क्या हो सकती है?

अद्यतन: अगर मैं इनट पर एचटीपीएप्लिकेशन (एचटीपी मॉड्यूल के सभी में होता है) के लिए एक चर बनाने के लिए एक समाधान मिला है, तो HttpContext को उस चर से एक्सेस किया जा सकता है।

अपडेट: प्रारंभिक कार्य पर HttpAplication या HttpContext.Current को पास करना एक ही समस्या है। जब एसिंक्रोनस कॉल के "स्टेट" के हिस्से के रूप में पारित किया जाता है, तो वे अंतिम कार्य में शून्य हो जाते हैं, भले ही वे प्रारंभिक कार्य में मान्य हों।

अद्यतन: मैंने कुछ लॉगिंग जोड़ दी है और पाया है कि मैं जो असिंक्रोनस कॉल कर रहा हूं वह सही ढंग से लौट रहा है, परिणाम वहां हैं, कॉलबैक फ़ंक्शन ठीक से लागू किया जाता है।

उत्तर

0

एक समाधान मिला है, अगर मैं इनट (एचटीपी मॉड्यूल के सभी में होता है) के लिए एक चर बनाते हैं, तो HttpContext को उस चर से एक्सेस किया जा सकता है।

+0

क्या आप विवरण के साथ वर्णन कर सकते हैं कि आपने समस्या को हल किया है – omoto

+0

मेरे एचटीपी मॉड्यूल में मेरे पास एक प्रकार का प्रकार है HttpAplication। Init() फ़ंक्शन कॉल में मैंने इस चर को Http अनुप्रयोग पर सेट किया है जो init को पास किया जाता है। BeginPreRequestHandlerExecute और EndPreRequestHandlerExecute में मैं OAplication.Context का उपयोग कर वर्तमान HttpContext का संदर्भ देता हूं, oHplication मेरे HttpModule में HttpAplication चर का नाम है। – aepheus

5

मुझे संदेह है कि मैं उस समस्या को जानता हूं जिसमें आप चल रहे हैं। उत्तर, लगभग निश्चित रूप से, WebClient के साथ उपयोग करने और WebClient के * Async विधियों का उपयोग करने के लिए है।

यहां लंबी व्याख्या है: दो पूरी तरह से अलग असिनक प्रोग्रामिंग मॉडल हैं: IAsyncResult Async Pattern और Event-based Asynchronous Pattern। IAsyncResult पैटर्न BeginXXX और EndXXX विधियों का उपयोग करता है, IAsyncResult उदाहरणों का उपयोग करता है, कॉलबैक के लिए प्रतिनिधियों का उपयोग करता है, और पूरा होने के लिए प्रतीक्षा का समर्थन करता है। इवेंट-आधारित पैटर्न एसिंक क्रियाओं को शुरू करने के लिए XXXAsync विधियों का उपयोग करता है, पूरा करने के लिए कॉलबैक के बजाय XXXCompleted ईवेंट का उपयोग करता है, और (यह आपके मामले में महत्वपूर्ण है) प्रत्येक कॉलबैक ईवेंट हैंडलर में थ्रेड-विशिष्ट संदर्भ स्थानांतरित करता है।

दूसरे शब्दों में, यदि आप अपने कॉलबैक कोड को XXX पूर्ण ईवेंट हैंडलर (जैसे WebClient.DownloadStringCompleted) के अंदर डालते हैं, तो HttpContext.Current सही ढंग से पॉप्युलेट हो जाएगा।

यदि, हालांकि, आप एक BeginXXX विधि (जैसे HttpWebRequest.BeginGetResponse) और एक प्रतिनिधि कॉलबैक का उपयोग करते हैं, तो आपका कॉलबैक उस थ्रेड के संदर्भ में निष्पादित किया जाएगा जो सही एएसपी.NET संदर्भ संलग्न करने की गारंटी नहीं देता है।

आम तौर पर, .NET Framework लाइब्रेरी कक्षाएं या तो एक async पैटर्न या अन्य का उपयोग करती हैं। आम तौर पर, निचले स्तर के वर्ग (उदा। HttpWebRequest) IAsyncResult पैटर्न का उपयोग करेंगे, जबकि उच्च-स्तरीय कक्षाएं (उदा। WebClient) ईवेंट-आधारित पैटर्न का उपयोग करेंगी। कुछ oddball वर्ग (उदा। स्वत: जेनरेट .NET Remoting proxies) दोनों पैटर्न का समर्थन करेंगे, लेकिन यह एक दुर्लभता है।

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

+0

मुझे यकीन नहीं है कि यह मेरे मामले में लागू करना कितना आसान होगा।मेरा मानना ​​है कि मैं कम से कम आधार स्तर पर IAsyncResult पैटर्न से जुड़ा हुआ हूं क्योंकि यह वह पैटर्न है जो AddOnPreRequestHandlerExecuteAsync का समर्थन करता है। और, चूंकि मेरे पास वर्तमान में एक चर में राज्य को सहेजकर काम कर रही चीजें हैं, इसलिए मैं इसके साथ गड़बड़ नहीं करना चाहूंगा। – aepheus