का इंतजार करने के बाद HttpContext.Current खो देता है। मेरे पास एक एएसपी.NET ऐप लक्ष्यीकरण .NET 4.6 है और मैं यह समझने की कोशिश कर रहा हूं कि क्यों HttpContext.Current
मेरे एसिंक एमवीसी नियंत्रक के अंदर पहली प्रतीक्षा के बाद शून्य हो गया कार्रवाई।एएसपी.नेट 4.6 एसिंक नियंत्रक विधि
मैंने जांच की है और तीन बार जांच की है कि मेरी परियोजना v4.6 को लक्षित कर रही है और web.config की targetFramework
विशेषता 4.6 है।
SynchronizationContext.Current
प्रतीक्षा से पहले और बाद में दोनों को सौंपा गया है और यह सही है, यानी AspNetSynchronizationContext
, विरासत में नहीं।
एफडब्ल्यूआईडब्ल्यू, सवाल में प्रतीक्षा थ्रेड को निरंतरता पर स्विच करता है, जो शायद इस तथ्य के कारण है कि यह बाहरी I/O-bound कोड (एक async डेटाबेस कॉल) को आमंत्रित करता है लेकिन यह कोई समस्या नहीं होनी चाहिए, AFAIU।
और फिर भी, यह है! तथ्य यह है कि HttpContext.Current
शून्य हो जाता है मेरे कोड के लिए लाइन के नीचे कई समस्याएं होती हैं और इससे मुझे कोई समझ नहीं आती है।
मैंने the usual recommendations चेक किया है और मैं सकारात्मक हूं कि मैं जो कुछ भी कर रहा हूं वह कर रहा हूं। मेरे पास कोड में बिल्कुल ConfigureAwait
है!
मैं पास क्या है, मेरे HttpApplication
उदाहरण पर async ईवेंट हैंडलर्स की एक जोड़ी है:
public MvcApplication()
{
var helper = new EventHandlerTaskAsyncHelper(Application_PreRequestHandlerExecuteAsync);
AddOnPreRequestHandlerExecuteAsync(helper.BeginEventHandler, helper.EndEventHandler);
helper = new EventHandlerTaskAsyncHelper(Application_PostRequestHandlerExecuteAsync);
AddOnPostRequestHandlerExecuteAsync(helper.BeginEventHandler, helper.EndEventHandler);
}
मैं कस्टम प्राधिकरण & सफाई तर्क है, जो async की आवश्यकता की वजह से इन दोनों की जरूरत है। AFAIU, यह समर्थित है और एक समस्या नहीं होनी चाहिए।
मैं देख रहा हूं कि इस परेशानीपूर्ण व्यवहार का कारण क्या हो सकता है?
अद्यतन: अतिरिक्त अवलोकन।
SynchronizationContext
संदर्भ प्रतीक्षा करने से पहले प्रतीक्षा बनाम वही रहता है। लेकिन इसके आंतरिक अंदर के रूप में स्क्रीनशॉट में देखा जा सकता है के बीच में बदल जाते हैं!
मुझे यकीन है कि कैसे (या यहां तक कि अगर) इस इस बिंदु पर मेरी समस्या के लिए प्रासंगिक हो सकता है नहीं कर रहा हूँ। उम्मीद है कि कोई और इसे देख सकता है!
क्या आप अपने नियंत्रक कार्यों पर 'कॉन्फ़िगरएवाइट (झूठी)' का आह्वान कर रहे हैं? –
@ पाउलो: नहीं, मैं नहीं हूं। – aoven
@Eldho: उस बिंदु का क्या होगा? मुझे नियंत्रक कार्रवाई पर एसिंक चाहिए और वास्तव में आंतरिक क्योंकि (यानी डीबी कॉल मैंने उल्लेख किया है, एक उदाहरण के रूप में) async हैं। एसिंक को हटाने के लिए मुझे कोड की एक बड़ी मात्रा को अक्षम करने की आवश्यकता होगी। – aoven