पुन: लोड किए बिना .NET वेबसाइट अपडेट करें


13

मैं में वेबसाइटों को विकसित करने के लिए प्रयोग किया जाता PHPहै और ASP classicऔर अगर कुछ की जरूरत को बदलने की। आप सिर्फ एक एकल / कई फ़ाइलों को बदल सकते हैं और कोई भी वास्तव में नोटिस नहीं करेगा। शायद अगर कोई अपलोड के दौरान बदली हुई फ़ाइल का अनुरोध करेगा, लेकिन वह आधे दूसरे मार्जिन की तरह है। अधिकांश छोटी साइटों के लिए यह कोई समस्या नहीं है।

लेकिन नवीनतम साइटें निर्मित होती हैं C# MVCऔर जब आप कोड में बदलाव करते हैं, तो आपको अपनी वेबसाइट को फिर से बनाने और परिवर्तित DLLफ़ाइलों को अपलोड करने की आवश्यकता होती है । लेकिन जब आप अपनी DLLफ़ाइलों को बदलते हैं तो यह आपकी वेबसाइट को फिर से शुरू करेगा और सभी सक्रिय रीसेट करेगा sessions। इसमें सब कुछ फिर से लोड करना पड़ता है और बड़ी साइटों के साथ सब कुछ लोड करने में कुछ मिनट लग सकते हैं। हर कोई जो साइट ब्राउज़ कर रहा था, वह नोटिस करेगा और फिर से लॉग इन करना होगा।

प्रमुख साइट अपडेट सामान्य नहीं हैं, इसलिए यह कोई समस्या नहीं है। लेकिन हमारे पास प्रोन्नति के लिए नियमित "छोटे" अपडेट हैं। जैसे 'इस फॉर्म को भरें और तीन महीने की मुफ्त सदस्यता पाएं ’या to ... की कीमत प्राप्त करने के लिए पहली 10 को एक छवि अपलोड करनी होगी’। मुझे लगता है कि आपको बहाव मिलेगा। कुछ प्रचार समान हैं और उन्हें एक मॉड्यूल के साथ संभाला जा सकता है जो सेटिंग्स के आधार पर सही जानकारी दिखाता है, लेकिन अक्सर इसे कस्टम कोड की आवश्यकता होती है।

मैं एक ऐसी प्रणाली के बारे में सोच रहा था, जहाँ प्रत्येक प्रमोशन DLLएक इंटरफेस के आधार पर स्वयं की फाइल हो, और फिर DLLडायनामिकली यूज़िंग लोड करें Type.GetType, Activator.CreateInstanceऔर InvokeMember। हालांकि यह काम कर सकता है, मैं सोच रहा हूं कि क्या यह सही रास्ता है।

तो मेरा सवाल है: आप .NETपूरी साइट को फिर से लोड किए बिना और ड्रॉपिंग सेशन (जैसे रीसायकल एप्लिकेशन पूल) के बिना मक्खी पर एक साइट को कैसे अपडेट करते हैं ।


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

जवाबों:


11

"अनुप्रयोग प्रारंभ" IIS 7.5, Windows 2008 R2 (सेटअप करने के लिए कठिन) IIS 8, Windows 2012 में देखें

ऐप इनिशियलाइज़ेशन किसी भी एप्लिकेशन (एप्लिकेशन पूल साइट नहीं) को ओवरलैप करने और पुराने का उपयोग करने के लिए पुनः आरंभ करने की अनुमति देता है, फिर भी नया एप्लिकेशन शुरू होने पर वार्म अप करते हुए पिछले एप्लिकेशन को चला रहा है। एक बार जब नया एप्लिकेशन समाप्त हो जाता है (आपके द्वारा निर्धारित URL द्वारा निर्धारित किया जाता है), यह नए एप्लिकेशन का उपयोग करना शुरू कर देगा और पिछले एक को बंद कर देगा। अनुप्रयोग पूल पुनरारंभ के दौरान सत्र को सुनिश्चित करने के तरीकों के साथ संयोजन के रूप में ऐप इनिशियलाइज़ेशन का उपयोग करके आपकी साइट को मूल रीबूट करने की अनुमति दे सकता है। (Zhaph में मशीन की के बारे में एक अच्छी बात है।)

ऐप इनिशियलाइज़ेशन कॉन्फ़िगरेशन के लिए उपरोक्त लिंक के अलावा, आप यह देखना चाहते हैं कि साइट रीस्टार्ट क्या हो सकती है - चूंकि साइट रीस्टार्ट एप्लिकेशन इनिटिलिजेशन का उपयोग नहीं करता है इसलिए साइट रीस्टार्ट सहज नहीं होगी।

आप IIS कॉन्फ़िगर कर सकते हैं ताकि DLL अपडेट तुरंत साइट रीस्टार्ट न हो, और न ही web.config में परिवर्तन हो (उच्च चेंज नॉटिफिकेशन वैल्यू ऑन httpRuntime और एक्सटर्नल कॉन्फिगरेशन फाइल्स, जो आपकी साइट के लिए प्रासंगिक है)।

अंतिम परिणाम यह है कि आप डीएलएल / कोड को बिना साइट पुनरारंभ के अपडेट कर सकते हैं, फिर एक ऐप रीस्टार्ट को बाध्य कर सकते हैं जो कोड के निर्बाध परिवर्तन के लिए AppInitialization पृष्ठभूमि का उपयोग करेगा।

कॉन्सर्ट में इन चीजों को करना सहज पुनरारंभ के लिए काफी अच्छा काम करता है।


वहाँ कदम का एक अच्छा सेट - निश्चित रूप से कुछ पर विचार करने के लिए :)
Zhaph - बेन ड्यूगिड

यह मुझे लगता है कि मैं क्या देख रहा था। इसे एक कोशिश देने और इसे स्थापित करने के लिए जा रहा है। धन्यवाद
ह्यूगो Delsing

@ ह्यूगोलेसिंग आशा है कि यह आपके लिए बहुत अच्छा काम करता है।
jeffreypriebe

धन्यवाद, यह वही है जिसका मैंने उपयोग किया है और यह बहुत अच्छा काम करता है।
ह्यूगो डेल्सिंग

यह सुनने के लिए @HugoDelsing खुशी आपके लिए भी काम की है।
jeffreypriebe

5

आपके द्वारा पूछे जाने वाले तरीके को संभालने के कई तरीके हैं, और आपके प्रश्न के लिए कुछ अलग पहलू हैं:

पदोन्नति के लिए छोटे अपडेट संभालें

हालांकि, आप वास्तव में यहां के बाद एक सामग्री प्रबंधन प्रणाली या समान हैं जो आपको मक्खी पर सामग्री को संपादित करने की अनुमति देता है (वर्डप्रेस / ड्रुपल या एनआईटी सीएमएस, उम्राको, ऑर्चर्ड, आदि के दृष्टिकोण से), हालांकि। यदि आप उस मार्ग से नीचे नहीं गए हैं तो कुछ चीजें आप आजमा सकते हैं।

क्योंकि ASP.NET केवल वास्तव में पुनः लोड होता है यदि आप कुछ प्रकार की फ़ाइल (web.config (s), अधिकतर /bin/और /app_code/फ़ोल्डरों की सामग्री) को स्पर्श करते हैं - और "अन्य फ़ाइल परिवर्तन" के लिए एक विन्यास सीमा है (मूल रूप से आपके द्वारा संशोधित किए जाने के बाद एक बार। आपकी साइट के भीतर कई फाइलें एप्लिकेशन पूल को फिर से शुरू कर देंगी - NumRecompilesBeforeAppRestart) आप कुछ ऐसा करने पर विचार कर सकते हैं जहां आप कुछ स्थिर (यानी .html) फाइलों के लिए एक अलग फ़ोल्डर की जांच करते हैं, जिन्हें आप आवश्यकतानुसार खींचते हैं और प्रदर्शित करते हैं, या LoadControlएक स्ट्रिंग पथ लेने वाली विधि का उपयोग करते हैं एक .ascxउपयोगकर्ता नियंत्रण और गतिशील रूप से इसे लोड करता है - आप यह कैसे निर्धारित करते हैं कि दिखाने के लिए स्टैकऑवरफ़्लो के लिए एक अलग प्रश्न अधिक अनुकूल है - हालांकि मैं एक नामकरण सम्मेलन आधारित समाधान की सिफारिश करूंगा।

आप प्रबंधित एक्स्टेंसिबिलिटी फ्रेमवर्क (MEF - जो कि संस्करण 4 के बाद से .NET फ्रेमवर्क का पूरा हिस्सा रहा है) जैसी किसी चीज़ का उपयोग करने पर भी ध्यान दे सकते हैं, जो आपको प्लगइन आधारित वास्तुकला लिखने और अपनी /bin/निर्देशिका के बाहर एक फ़ोल्डर निर्दिष्ट करने की अनुमति देता है। नया .DLLs - हालाँकि मैंने यह देखने की कोशिश नहीं की है कि क्या यह ऐप रीस्टार्ट इश्यू से बचेगा, या नहीं, मैंने किसी साइट पर कॉमन फ़ंक्शनलिटी जोड़ने के लिए वेब वातावरण में अच्छे प्रभाव के लिए इसका उपयोग किया है।

यदि वह अपील नहीं करता है, तो केवल एक अन्य विकल्प जिसके बारे में मैं सोच सकता हूं, वह है "कोड-इन-फ्रंट" के रूप में नियंत्रण जोड़ना जैसा कि हमने क्लासिक एएसपी में किया था - अर्थात <script runat="server">एक संकलित "कोड-पीछे" वर्ग के बजाय एक ब्लॉक के साथ इसमें नियंत्रण को चलाने के लिए तर्क शामिल हैं - यह DLL परिवर्तन की आवश्यकता को हटा देगा, कुछ पहली बार प्रदर्शन हानि की कीमत पर क्योंकि नियंत्रण मक्खी पर संकलित किया गया है - फिर आपको NumRecompilesBeforeAppRestartयदि आप के साथ इसे संतुलित करने की आवश्यकता होगी 'बहुत कम बदलाव कर रहे हैं।

मैं ऐप रीस्टार्ट में सत्र कैसे जारी रख सकता हूं?

यह संभवतः हल करने के लिए एक आसान मुद्दा है और इसमें तीन प्रमुख चरण शामिल हैं:

  1. MachineKey (IIS7, लेकिन अभी भी 8 के लिए कॉन्फ़िगर करें) के बजाय एक स्थिर मान होना चाहिए AutoGenerate- इसका मतलब है कि जब AppPool रीसायकल करता है तो यह उसी कुंजी का उपयोग करेगा, और इसलिए सत्र कुकीज़, व्यूस्टेट आदि को डिक्रिप्ट करने में सक्षम होगा। रीसायकल।
  2. या तो एक स्टेट सर्वर सेटअप करें या एक सेशन स्टेट रखने के लिए डेटाबेस को कॉन्फ़िगर करें
  3. अपने web.config में SessionState तत्व के उपयोग InProcसे StateServerया SQLServerमें स्विच करें।

इस तरह आपके पास लगातार सत्र होंगे जो ऐप रीस्टार्ट से बचे रहेंगे। हालाँकि, ये "निशुल्क" नहीं हैं - सत्र में आपके द्वारा संग्रहित सब कुछ अब धारावाहिक होना चाहिए, और आप एक मामूली प्रदर्शन को प्रभावित करेंगे क्योंकि प्रत्येक पृष्ठ लोड को अब अतिरिक्त नेटवर्क ट्रिप प्राप्त करने की आवश्यकता होगी, और संभावित रूप से सत्र डेटा जारी करना होगा।

हालाँकि, यदि आप ऐसी स्थिति में हैं जहाँ पर परिनियोजन के बाद पुनः आरंभ करने के लिए एप्लिकेशन के लिए "कई मिनट" लगते हैं, तो आप लोड-संतुलित वातावरण में जाने पर विचार कर सकते हैं, या कम से कम हॉट-स्वैपेबल स्टेजिंग / लाइव सेटअप (जैसे कि Azure / AWS / etc द्वारा प्रदान किया गया।) - इस तरह आप इसे अपडेट करते समय एक सर्वर ऑफ़लाइन ले सकते हैं या इसे नए कोड के साथ तैयार कर सकते हैं और फिर इसे स्वैप कर सकते हैं - बशर्ते आपने साझा किए गए पते पर कदम उठाए हों सत्र (ऊपर देखें) यह आपके उपयोगकर्ताओं के लिए कोई प्रभाव नहीं के साथ ठीक काम करेगा।


आपके लंबे उत्तर के लिए धन्यवाद। दुर्भाग्य से CMSमैं क्या चाहता हूं। मैं सामग्री को बदलना नहीं चाहता, मैं कोड बदलना चाहता हूं। सत्रों के बारे में हिस्सा सिर्फ एक उदाहरण था। इसे बदलने से साइट की समस्या का हल एक या दो मिनट के लिए नहीं होगा जब यह DLLफ़ाइलों को पुनः लोड कर रही है। MEFभाग दिलचस्प था, लेकिन प्रणाली मैं के बारे में सोच रहा था के लिए एक तीसरी पार्टी के समाधान है। तो प्रयास के लिए +1, लेकिन दुर्भाग्य से यह वास्तव में मेरे प्रश्न का उत्तर नहीं है।
ह्यूगो डेल्सिंग

1
मैंने उन बिंदुओं के एक जोड़े को संबोधित करने के लिए अपना जवाब अपडेट किया है: एमईएफ एमएस द्वारा जारी किया गया था और v4 के बाद से .NET फ्रेमवर्क का एक पूर्ण हिस्सा रहा है। आप अपने नए नियंत्रण के लिए कोड-इन-सामने का उपयोग कर की कोशिश कर सकते, वैकल्पिक रूप से एक लोड संतुलित / स्थिति निर्धारण रहते सेटअप है कि एक सर्वर है और चल पाने के लिए सक्षम होगा और उसके बाद में यह स्वैप अपनाने।
Zhaph - बेन Duguid

1
मैंने एप्लिकेशन इनिशियलाइज़ेशन का उपयोग करके एक वैकल्पिक समाधान को रेखांकित किया है। लाभ यह है कि सभी कोड और सर्वर सेटअप "सामान्य" है विशेष लोड-संतुलन या गतिशील रूप से लोडिंग नियंत्रण के बिना, आपके चल रहे वातावरण को सरल बनाए रखना। बेशक, एक लोड-संतुलन / स्टेजिंग-लाइव सेटअप अन्य कारणों से उपयोगी हो सकता है।
jeffreypriebe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.