मैं एक http मॉड्यूल बना रहा था और डीबगिंग करते समय मैंने कुछ ऐसा देखा जो पहले (कम से कम) अजीब व्यवहार की तरह लग रहा था।HttpModule Init विधि कई बार कहा जाता है - क्यों?
जब मैं httpmodule की init विधि में ब्रेकपॉइंट सेट करता हूं तो मैं देख सकता हूं कि http मॉड्यूल इनिट विधि को कई बार कहा जा रहा है, भले ही मैंने केवल डीबगिंग के लिए वेबसाइट शुरू की है और एक ही अनुरोध किया है (कभी-कभी यह केवल 1 बार मारा, अन्य बार 10 गुना)।
मुझे पता है कि मुझे एचटीपी अनुप्रयोग के कई उदाहरण चलने की उम्मीद करनी चाहिए और प्रत्येक http मॉड्यूल के लिए बनाया जाएगा, लेकिन जब मैं एक पृष्ठ का अनुरोध करता हूं तो इसे एक ही http अनुप्रयोग ऑब्जेक्ट द्वारा संभाला जाना चाहिए और इसलिए केवल आग घटनाएं एक बार जुड़ी होती हैं, लेकिन फिर भी यह प्रत्येक अनुरोध के लिए घटनाओं को कई बार आग लगती है, जो कोई समझ नहीं लेती है - इसके अलावा इसे httpAplication के भीतर कई बार जोड़ा जाना चाहिए - जिसका अर्थ यह है कि यह एक ही httpmodule init विधि है जिसे हर बार कहा जाता है और नहीं प्रत्येक बार जब यह मेरा ब्रेक पॉइंट हिट करता है तो एक नया http एप्लिकेशन बनाया जा रहा है (नीचे मेरा कोड उदाहरण देखें)।
क्या गलत हो सकता है? ऐसा इसलिए है क्योंकि मैं डीबगिंग कर रहा हूं और http मॉड्यूल में ब्रेकपॉइंट सेट कर रहा हूं?
यह देखा गया है कि ऐसा लगता है कि अगर मैं डीबगिंग के लिए वेबसाइट शुरू करता हूं और httpmodule में ब्रेकपॉइंट पर तेज़ी से कदम उठाता हूं तो यह केवल एक बार init विधि को दबाएगा और यह ईवेंटशेलर के लिए भी जाता है। अगर मैं इसे कुछ सेकंड के लिए ब्रेकपॉइंट पर लटकने देता हूं तो इनिट विधि को कई बार बुलाया जा रहा है (ऐसा लगता है कि यह ब्रेकपॉइंट पर कदम उठाने से पहले कितना समय इंतजार करता है)। शायद यह सुनिश्चित करने के लिए कुछ निर्माण हो सकता है कि httpmodule प्रारंभ किया गया है और http अनुप्रयोग अनुरोधों को पूरा कर सकता है, लेकिन ऐसा कुछ ऐसा लगता है जो विनाशकारी परिणाम हो सकता है।
यह तार्किक प्रतीत हो सकता है, क्योंकि यह अनुरोध को समाप्त करने का प्रयास कर रहा है और चूंकि मैंने ब्रेक पॉइंट सेट किया है, ऐसा लगता है कि कुछ गलत हो गया है और फिर से इनिट विधि को कॉल करने का प्रयास करें? तो यह अनुरोध संभाल सकता है?
लेकिन क्या यह हो रहा है और क्या सब ठीक है (मैं अनुमान लगा रहा हूं), या यह एक वास्तविक समस्या है?
जो मैं विशेष रूप से चिंतित हूं वह यह है कि अगर कुछ सेकंड के लिए "उत्पादन/लाइव" सर्वर पर कुछ लटकता है तो बहुत सारे ईवेंट हैंडलर इनिट के माध्यम से जोड़े जाते हैं और इसलिए पृष्ठ पर प्रत्येक अनुरोध अचानक घटनाक्रम को आग लगा देता है बहुत बार।
यह व्यवहार जल्दी से किसी भी साइट को नीचे ला सकता है।
मैंने फॉर्मेट प्रमाणीकरण और रोलमैनगर्म्यूल आदि के लिए httpmodules के लिए उपयोग किए जाने वाले "मूल" .NET कोड को देखा है, लेकिन मेरा कोड कोई भी अलग नहीं है जो उन मॉड्यूल का उपयोग करता है।
मेरा कोड इस तरह दिखता है।
public void Init(HttpApplication app)
{
if (CommunityAuthenticationIntegration.IsEnabled)
{
FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];
formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
}
}
यहाँ एक उदाहरण है कि यह कैसे .NET फ़्रेमवर्क
public void Init(HttpApplication app)
{
if (Roles.Enabled)
{
app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
app.EndRequest += new EventHandler(this.OnLeave);
}
}
किसी को पता क्या चल रहा है है से RoleManagerModule में किया जाता है?
(मैं बस आशा है कि किसी को वहाँ मुझे बता सकते हैं क्यों यह हो रहा है और विश्वास दिलाता हूं मुझे है कि सब कुछ बिल्कुल ठीक है) :)
अद्यतन:
मैं कोशिश की है समस्या को कम करने के लिए और अब तक मुझे पता चला है कि इनिट विधि को हमेशा मेरे http मॉड्यूल की एक नई वस्तु पर रखा जाता है (जो मैंने पहले सोचा था)।
मुझे लगता है कि पहले अनुरोध के लिए (साइट शुरू करते समय) सभी एचटीपी अनुप्रयोगों का निर्माण किया जा रहा है और इसके मॉड्यूल सभी पहले अनुरोध की सेवा करने की कोशिश कर रहे हैं और इसलिए सभी को घटनाक्रम को जोड़ा जा रहा है। मैं वास्तव में यह नहीं समझ सकता कि यह क्यों हो रहा है।
यदि मैं किसी अन्य पृष्ठ का अनुरोध करता हूं तो सभी एचटीपीएप्लिकेशंस के बनाए गए (और उनकी विनम्रता) फिर से अनुरोध को पूरा करने का प्रयास करेगा क्योंकि यह कई बार ईवेंटहैंडर को मारने का कारण बनता है।
लेकिन ऐसा लगता है कि अगर मैं पहले पृष्ठ पर वापस कूदता हूं (या दूसरा) केवल एक एचटीपी आवेदन अनुरोध की देखभाल करना शुरू कर देगा और सब कुछ अपेक्षित है - जब तक मैं इसे लटका नहीं देता ब्रेक प्वाइंट
यदि मैं इसे ब्रेकपॉइंट पर लटकने देता हूं तो यह नया एचटीपी एप्लीकेशन की ऑब्जेक्ट्स बनाना शुरू कर देता है और अनुरोध को पूरा/संभालने के लिए एचटीपीएप्लिकेशंस (1 से अधिक) जोड़ना शुरू करता है (जो पहले से ही एचटीपी एप्लीकेशन द्वारा सेवा की प्रक्रिया में है जो वर्तमान में बंद है ब्रेकपॉइंट पर)।
मुझे लगता है या उम्मीद है कि यह लोड और/या त्रुटियों को वितरित करने और संभालने में मदद करने के तरीके के पीछे "दृश्यों के पीछे" कुछ बुद्धिमान हो सकता है। लेकिन मुझे कोई सुराग नहीं है। मुझे उम्मीद है कि कुछ लोग मुझे आश्वस्त कर सकते हैं कि यह बिल्कुल ठीक है और यह कैसा होना चाहिए?
मैं हमारे HttpModule रूप में अच्छी तरह –
जॉन में इस व्यवहार को दिखाई दे रहा है: मैं इस एक बंद करने के लिए भूल गया है। ऐसा होता है (कम से कम मेरे मामले में) क्योंकि मॉड्यूल किसी भी संसाधन (छवियों, जावास्क्रिप्ट, स्टाइलशीट) के लिए बनाता है हर अनुरोध से हिट हो जाता है। इसका कारण यह है कि यह एमवीसी आदि में इस्तेमाल किया जाने वाला रूटिंग मॉड्यूल है। सभी अनुरोधों को रूटिंग मॉड्यूल द्वारा संभाला जाना आवश्यक है और सभी अनुरोधों के लिए मॉड्यूल दुर्भाग्य से मारा गया है। मैंने इसके बारे में एक सवाल पूछा है, लेकिन किसी ने इसका उत्तर नहीं दिया है। – MartinF