2009-05-08 13 views
50

परिदृश्य: मेरे पास वेब परिनियोजन परियोजनाओं का उपयोग करके एक एन-टियर एंटरप्राइज़ एएसपी.NET एप्लिकेशन तैनात किया गया है। सभी स्तर एएसपी.NET आवेदन द्वारा उपभोग की जाने वाली स्वतंत्र असेंबली का उत्पादन करते हैं।ऐपडोमेन में एएसपी.NET असेंबली को जिंदा रखने के लिए कैसे?

समस्या: जब मैं ऐप चलाता हूं। तैनाती के बाद पहली बार स्मृति में निर्भर असेंबली लोड करने में काफी समय लगता है। लेकिन एक बार अपनी रोशनी तेज ऐप लोड किया। यदि कोई ऐप एक्सेस करने वाले उपयोगकर्ता नहीं हैं, तो आईआईएस मेमोरी से असेंबली को अनलोड करता है और जब किसी उपयोगकर्ता ने बाद के उदाहरण पर ऐप तक पहुंचने का प्रयास किया तो यह सभी असेंबली को लोड करने के लिए एक ही बार लोड करने के लिए लोड हो जाता है पहली बार ऐसा करने के लिए लेता है।

मैं ऐसे समाधान की तलाश में हूं जो मुझे मेरी असेंबली को मेमोरी रेजीडेंसी की ओर असेंबली की अस्थिर प्रकृति को लगातार ओवरराइड करने में सक्षम बनाता है।

या कोई अन्य समाधान जो मेरे उपयोगकर्ताओं को खुशी से उल्लिखित समस्या को हल करने के लिए ऐप का उपयोग करने देता है।

उत्तर

72

आईआईएस 6 में, एप्लिकेशन पूल अनुभाग पर जाएं, और पूल पर गुण राइट-क्लिक करें जो प्रश्न में एएसपी.NET एप्लिकेशन होस्ट करता है। प्रदर्शन टैब पर जाएँ और सही का निशान हटाएँ "के लिए निष्क्रिय होने के बाद शटडाउन कार्यकर्ता प्रक्रियाओं:"

में IIS 7, कनेक्शन फलक के पास जाकर आवेदन ताल मिल जाए, और पूल जो आपके आवेदन को होस्ट करता है के लिए उन्नत सेटिंग्स का चयन करें। "निष्क्रिय टाइमआउट" संपत्ति ढूंढें और इसे "0" पर सेट करें (यह इसे अक्षम करता है)।

डिफ़ॉल्ट 20 मिनट निष्क्रियता है। बॉक्स को अनचेक करके, AppDomainworker process द्वारा लोड हो जाने पर, यह कभी मर नहीं जाएगा (जब तक आप प्रक्रिया को मार नहीं लेते या कुछ निश्चित रूप से नहीं)। डिफ़ॉल्ट रूप से, आईआईएस recycle the process होगा जब यह कुछ सीमा तक पहुंच जाए, जैसे मेमोरी कैप, लेकिन यह एक नया भी शुरू करेगा और सभी आने वाले अनुरोधों को "चरण खत्म" करेगा जब तक कि पुराना एक अप्रयुक्त नहीं होता है, ताकि व्यवधान को कम किया जा सके।

मैंने सामान्य परिस्थितियों में keep your ASP.NET application alive (alternate archived version) एक छोटा सी # कक्षा भी लिखी है। चूंकि यह एप्लिकेशन के भीतर चलता है, जाहिर है कि यह प्रक्रिया को स्पष्ट रूप से मारने से आईआईएस या कुछ और नहीं रोक सकता है, लेकिन यह एप्लिकेशन को "गर्म" रखेगा, उदाहरण के लिए आईआईएस इसे बंद करने का फैसला करने के लिए ऐप लंबे समय तक निष्क्रिय नहीं होगा।

यदि आपके आईआईएस कॉन्फ़िगरेशन (साझा मेजबान, उदाहरण के लिए) पर आपका प्रत्यक्ष नियंत्रण नहीं है, तो आपकी सबसे अच्छी शर्त एक अलग सिस्टम पर चलने वाला एक छोटा एप्लीकेशन है - कहें, हमेशा एक वर्कस्टेशन - जो आपकी साइट को हर किसी पर हिट करता है आवेदन पूल को समय-समय पर रखने के लिए x मिनट। कुछ भी नहीं - एक कंसोल एप्लिकेशन में एक साधारण WebRequest और थोड़ी देर() लूप होगा।

+0

मेरे पास एक साझा सर्वर है। मुझे उस विवरण में आईआईएस कॉन्फ़िगरेशन तक पहुंच नहीं है। आवेदन स्तर पर कोड या कॉन्फ़िगरेशन द्वारा हम इसे किसी भी तरह से कर सकते हैं? –

+0

@s_ruchit एप्लिकेशन पूल और कार्यकर्ता प्रक्रियाओं का नियंत्रण आईआईएस गुंजाइश पर है, इसलिए नहीं। आपकी स्थिति में सबसे आम समाधान यह है कि किसी अन्य कंप्यूटर पर एक एप्लिकेशन रहें (कहें, हमेशा काम करने वाला) जो आपकी साइट पर प्रत्येक पृष्ठ को 10-15 मिनट तक हिट करता है। एक सेवा जिसे मैंने व्यक्तिगत रूप से उपयोग नहीं किया है, जो आपके लिए ऐसा करने का दावा करता है http://www.keepaliveforever.com/ –

+0

@Rex M: यह शानदार था। मैं कभी भी बॉक्स से बाहर नहीं था। यह इतना आसान हो सकता है! अनेक अनेक धन्यवाद। वास्तव में हम ऐप को हमेशा जिंदा रखने के लिए अपना स्वयं का http क्लाइंट लिख सकते हैं। –

0

मैंने थोड़ा सी # कंसोल एप्लिकेशन लिखा जो विंडोज़ टास्क शेड्यूलर के माध्यम से हर 4 मिनट जीवित रहता है। जीवन एक बार फिर अच्छा है। हम ऐप को 2-5am से नहीं चलाते हैं, इसलिए यदि सेवा भी मायने रखती है, तो सेवा मेमोरी के किसी भी सफाई को कर सकती है। हमारी साइट्स के लिए वैसे भी उन घंटों में शायद ही कभी कोई भी है।

+0

मैंने इसे भी किया है लेकिन हर 1 मिनट - वैसे भी आवेदन नीचे चला जाता है। – Azimuth

3

एएसपी नेट के फायदों में से एक वस्तु वस्तुओं के स्थैतिक (साझा) उदाहरण बनाने की क्षमता है।

बाहरी प्रक्रिया की आवश्यकता से बचने के लिए आप एक स्थिर टाइमर (प्रति उदाहरण) global.asax बना सकते हैं जो एक सरल WebRequest के साथ डोमेन पर एक पृष्ठ की मांग करता है। इस तरह से साइट पूल के मैन्युअल रीसेट होने तक खुद को जीवित रखती है।

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