मैं सेवा को रोकने के बिना सर्वर प्रक्रिया के लिए एक डीएल अपडेट करना चाहता हूं। मैं उसको कैसे करू? थोड़ा सा एएसपीनेट स्वचालित रूप से बिन फ़ोल्डर में रखे नए डीएलएस को कैसे उठाता है।सेवा को रोकने के बिना एक डीएल अपडेट करें
उत्तर
Asp.Net एक तकनीक shadow copy
कहा जाता है आप किसी अनुप्रयोग के बिन उपनिर्देशिका में एक अद्यतन dll की प्रतिलिपि बनाते हैं का उपयोग करता है, ASP.NET क्रम पहचानता वहाँ निष्पादित करने के लिए नए कोड है। चूंकि ASP.NET मौजूदा ऐपडोमेन में डीएल को स्वैप नहीं कर सकता है, इसलिए यह एक नया ऐपडोमेन शुरू करता है। पुराना एप्लिकेशन डोमेन "नाली रुक गया" है, यानी मौजूदा अनुरोधों को निष्पादित करने की अनुमति है, और एक बार जब वे सभी समाप्त हो जाएंगे तो ऐपडोमेन अनलोड हो सकता है। नया ऐपडोमेन नए कोड से शुरू होता है और सभी नए अनुरोधों को लेना शुरू करता है।
आमतौर पर, जब एक डीएलएल प्रक्रिया में लोड होता है, तो प्रक्रिया डीएल को लॉक करती है और आप डिस्क पर फ़ाइल को ओवरराइट नहीं कर सकते हैं। हालांकि, ऐपडोमेन्स में एक विशेषता है जिसे छाया प्रतिलिपि कहा जाता है जो असेंबली को डिस्क पर अनलॉक और बदलने योग्य रहने की अनुमति देता है।
रनटाइम बिन निर्देशिका के लिए सक्षम छाया प्रतिलिपि के साथ ASP.NET प्रारंभ करता है। AppDomain स्मृति में डीएल को लॉक करने और लोड करने से पहले किसी भी डीएलएल को बिन निर्देशिका से अस्थायी स्थान पर कॉपी करने की आवश्यकता होगी। छाया प्रतिलिपि हमें वेब एप्लिकेशन ऑफ़लाइन बिना अपडेट के दौरान बिन निर्देशिका में किसी भी डीएल को ओवरराइट करने की अनुमति देती है।
हाइबरनेटिंग राइनो के एपिसोड # 5 पर एक नज़र डालें: http://ayende.com/hibernating-rhinos.aspx – asgerhallas
हाइबरनेटिंग राइनो पॉडकास्ट स्थानांतरित हो गए हैं।मई 2011 तक अपने नए स्थान का वर्णन करने वाले आयेंडे से यह पोस्ट देखें: http://ayende.com/blog/4838/hibernating-rhinos-webcasts –
गुलजार के जवाब के अलावा:
यदि आपकी सेवा बस सीधे DLL के आप AppDomains और ShadowCopy क्षमताओं का उपयोग करने के लिए इस सुविधा का लाभ लेने के लिए एक सा फिर से डिजाइन सेवा की आवश्यकता होगी संदर्भित कर रहा है।
हम ऐसा कुछ करते हैं जहां सेवा केवल एक खोल/मेजबान प्रक्रिया है। जब आवश्यक हो तो सभी कार्यक्षमता अलग-अलग ऐप डोमेन में लोड की जाती है।
एक प्रक्रिया एक dll यह इसे बदलने के लिए संभव नहीं है के लोड होते ही है।
आईआईएस स्मृति में लोड होने पर डीएलएल को लोड नहीं करता है (affected by the Cache property) और मुझे लगता है कि यह एएसपी.नेट के मामले में भी है। यदि आप एक ही रणनीति का पालन करते हैं तो आप अपने डीएलएस भी अपडेट कर सकते हैं।
हालांकि यदि आपके डीएलएस का उपयोग किया जा रहा है, तो आपके पास अपने सर्वर की प्रक्रिया को अपने सभी डीएलएस को उतारने के लिए बताने का एक तरीका होना चाहिए।
ऐसा होने के लिए सर्वर प्रक्रिया को लोडLibrary कॉल का उपयोग करके सभी डीएलएलएस लोड करना होगा, जैसे कि यह ऐसा करने के लिए संचार प्राप्त करने पर उन्हें अनलोड कर सकता है।
सर्वर प्रक्रिया के साथ संचार करना एक वैश्विक रूप से उपलब्ध नामित ईवेंट बनाकर किया जा सकता है जिसे नए कार्यक्रम द्वारा एक्सेस किया जा सकता है और चलने वाली प्रक्रिया को सिग्नल करने के लिए उपयोग किया जाता है कि एक अद्यतन होने वाला है। (आप ऐसा करने के अन्य बदलावों के बारे में भी सोच सकते हैं)।
आपकी सेवा किस भाषा/भाषा में लिखी गई है? Win32 और .NET के बीच एक बड़ा अंतर है जब यह इस समस्या के समाधान के लिए आता है ... – mdb
यह एक .net ऐप है। – Matt
ध्यान दें कि एएसपीनेट चलाना जारी रहता प्रतीत होता है, जबकि उपयोगकर्ता गतिविधि अभी भी बाधित हो सकती है और जब बिन फ़ोल्डर में नए डीएलएल रखे जाते हैं तो काम की हानि हो सकती है। – StingyJack