2011-09-01 15 views
10

रीसाइक्लिंग करता है तो मैं यह पता लगाने की कोशिश कर रहा हूं कि वेब.कॉन्फिग फ़ाइल को संशोधित करने या आईआईएस एप्लिकेशन पूल को मैन्युअल रूप से पुनर्नवीनीकरण के कारण एएसपी.NET एप्लिकेशन रीसाइक्लिंग कर रहा है।पता लगाना कि जब कोई एएसपी.NET अनुप्रयोग

शुरू में मैंने सोचा था कि ASP.NET के Application_End विधि काम होता है, और करने की कोशिश की है:

protected void Application_End(object sender, EventArgs e) 
{ 
    File.AppendAllText("log.txt", DateTime.Now + "\n"); 
} 

फ़ाइल पहली बार web.config फ़ाइल बदल गया था बनाया गया था, लेकिन बाद में परिवर्तन आग नहीं था घटना। इसी प्रकार, आईआईएस में परीक्षण करते समय, पहली मैनुअल एप्लिकेशन पूल रीसायकल ने फ़ाइल बनाई लेकिन बाद में लोगों ने ऐसा नहीं किया - ऐसा लगता है कि एप्लिकेशन_इंड इवेंट केवल एक बार आग लगती है।

पूल/ऐप रीसायकल के हर बार मैं कैसे पता लगाऊंगा?

+6

क्या आप एप्लिकेशन_स्टार्ट का उपयोग भी कर सकते हैं? मुझे लगता है कि शटडाउन या पावर आउटेज जैसी कुछ घटनाएं आपको बताएंगी कि एप्लिकेशन_इंड कहलाता था। –

+1

क्या आपने यह सुनिश्चित किया है कि आपने web.config फ़ाइल को बदलने के बाद एप्लिकेशन में किसी पृष्ठ को एक्सेस किया है, तो यह समाप्त हो गया और फिर फिर से शुरू हुआ? क्योंकि अगर यह फिर से शुरू नहीं हुआ, तो मैं देख सकता था कि आवेदन_इंड को बाद में फायरिंग से रोकना। – StriplingWarrior

उत्तर

4

निम्नलिखित एक हैक का थोड़ा सा हो सकता है लेकिन आप इसका पता लगाने के लिए Cache एप्लिकेशन का उपयोग कर सकते हैं। प्रत्येक पृष्ठ लोड होने पर आप एक विशिष्ट कुंजी के लिए कैश की जांच कर सकते हैं, यदि कुंजी मौजूद नहीं है तो आप इसे 'रीसायकल' पर विचार कर सकते हैं और फिर कुंजी जोड़ सकते हैं। सबसे अच्छी विधि नहीं है लेकिन आपको जो चाहिए वह सिर्फ काम कर सकती है।

ईजी। अपने आधार पेज के Page_Load या कहीं कि प्रत्येक अनुरोध के साथ चलेंगे में, आपको निम्न कर सकता है:

if (HttpContext.Current.Cache["RecycleCheck"] != null) 
{ 
    // Add flag to cache 
    HttpContext.Current.Cache.Insert("RecycleCheck", "1", null, 
     DateTime.UtcNow.AddDays(2), // 2 days (most will recycle by then) 
     System.Web.Caching.Cache.NoSlidingExpiration); 

    // Do what you need because a recycle has happened 
} 

इस विधि यह लेने नहीं होगा के रूप में पुनरावृत्ति होता है। यह रीसायकल के बाद पहले अनुरोध पर केवल एक रीसायकल की पहचान करेगा।

Application_Start ऐसा करने के लिए सबसे विश्वसनीय स्थान होगा लेकिन यह पहले ही अनुरोध पर रीसायकल के बाद होता है, इस तथ्य के साथ हैक के समान मुद्दे से पीड़ित है।

+1

क्या यह कुछ भी हल करता है जो 'Application_Start' नहीं करता है? – TheCodeKing

+0

@TheCodeKing वास्तव में ऐसा नहीं है इसलिए मैंने कहा (मेरे उत्तर की अंतिम पंक्ति देखें) 'Application_Start' सबसे अच्छी जगह होगी। केवल अगर किसी कारण से समस्याएं 'Application_End' और' Start' को ट्रिगर नहीं करती हैं, तो यह एक हैकी विकल्प है। – Kelsey

+1

यह सिर्फ 'Application_Start' ** ** ** हमेशा कॉल किया जाएगा, यह केवल' Application_End' है जो उदाहरण के लिए ऐप रीसायकल पर नहीं हो सकता है। – TheCodeKing

0

आप ऐसा कुछ क्यों नहीं करते हैं। ऐपपूल रीसायकल करते समय निर्धारित करने में सटीकता बढ़ाने के लिए टाइमर नौकरी की आवृत्ति समायोजित करें।

private readonly Timer timer = new Timer(); 
private DateTime start; 
private string logFile; 

void Application_Start(object sender, EventArgs e) 
{ 
    start= DateTime.Now; 
    logFile = Server.MapPath(
      string.Concat("Log-",start.ToString("yyyyMMdd-HHmmss.fff"),".txt")); 

    timer.Interval = 1000; 
    timer.Elapsed += (s, ee) 
      => File.WriteAllText(logFile, 
      string.Concat("App Start :", start, " Last Alive: ", DateTime.Now)); 

    timer.Start(); 
} 
2

इस प्रश्न का अनुसरण ढेर अतिप्रवाह सवाल में प्रदान किया गया करने के लिए अच्छा जवाब: how to detect if the current application pool is winding up

रीसाइक्लिंग आप IRegisteredObject इंटरफ़ेस को लागू करने की जरूरत है अनुप्रयोग पूल को ट्रैक करने के लिए, का एक उदाहरण बनाने के लिए ApplicationManager.CreateObject फोन अपने ऑब्जेक्ट करें और फिर इसे अपने आवेदन के दौरान होस्टिंगएन्वायरमेंट के साथ पंजीकृत करें। रजिस्ट्रार ऑब्जेक्ट।

जब इस ऑब्जेक्ट के आईआरजीस्टर्ड ऑब्जेक्ट। स्टॉप (बूल) कार्यान्वयन को पैरामीटर के रूप में गलत कहा जाता है, तो यह अधिसूचना है कि ऐप डोमेन बंद हो रहा है और ऑब्जेक्ट को अनियंत्रित किया जाना चाहिए (वैश्विक निपटान की तरह) HostingEnvironment.UnregisterObject पर कॉल करें।

तो, इस घटना का उपयोग करके आप ट्रैक कर सकते हैं जब एप्लिकेशन पूल रीसाइक्लिंग किया जाता है।

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