2011-06-24 16 views
6

मेरे पास विंडोज सेवा में होस्ट की गई डब्ल्यूसीएफ सेवा है और मैं मेजबान (.exe) और सेवा लाइब्रेरी (.dll) में 2 असेंबली हैं। जब सेवा लाइब्रेरी अपडेट की जाती है तो हमें लाइब्रेरी को प्रतिस्थापित करने के लिए सेवा को रोकना होगा। मैं आईआईएस की समान कार्यक्षमता चाहता हूं, जैसे सेवा को पुनरारंभ किए बिना लाइब्रेरी को प्रतिस्थापित करना। क्या यह संभव है और कैसे?सेवा को पुनरारंभ किए बिना डब्ल्यूसीएफ सेवा पुस्तकालय को बदलें

उत्तर

4

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

संपादित

(1) एक ServiceHost एक विशिष्ट प्रकार के पुस्तकालय में एक वर्ग का उपयोग शुरू करने के लिए, आप प्रतिबिंब का उपयोग करना होगा। निम्नलिखित की तरह कुछ:

Assembly myAssembly = Assembly.LoadFile(path); 

Type serviceType = myAssembly.GetType(className); 

ServiceHost serviceHost = new ServiceHost(serviceType); 

यह दस्तावेज़ीकरण से स्पष्ट नहीं है कि लोडफाइल निर्भरताओं को कैसे हल करता है। आपको इस काम को करने के लिए विधानसभा को हुक करना पड़ सकता है। मॉड्यूलरोलव घटना।

(2) फ़ाइल सिस्टम मॉनीटर निश्चित रूप से कुछ ओवरहेड लेते हैं, लेकिन मेरे अनुभव में, यह न्यूनतम है। किसी भी मामले में, यह वास्तव में आपका एकमात्र विकल्प है जब तक कि आप अद्यतन डीएलएल के लिए इंस्टॉलर के साथ नहीं जाना चाहते।

(3) मुझे नहीं पता कि आपकी फ़ाइल लॉक क्यों है। आपको खुद को समस्या निवारण करना होगा।

+0

उत्तर देने वाले पीटर के लिए धन्यवाद। बस यह समझना चाहेंगे कि होस्ट का पुनरारंभ करने का मतलब क्या है, क्या आपका मतलब है कि वैसे भी विंडोज सेवा को पुनरारंभ करना होगा? – NDeveloper

+0

नहीं। विंडोज सेवा एप्लिकेशन कभी भी पुनरारंभ नहीं होता है। एक "पुनरारंभ" का अर्थ है सेवाहोस्ट ऑब्जेक्ट को आपकी सेवा को होस्ट करना, नई डीएलएल की प्रतिलिपि बनाना, फिर एक नई सेवाहोस्ट ऑब्जेक्ट बनाना और शुरू करना। –

+0

और ऐसी कई सेवाओं में कोई समस्या नहीं होगी। मेरा मतलब है कि यह सिस्टम प्रदर्शन को प्रभावित नहीं करेगा, जिसमें बहुत से फाइलवॉचर हैं? और सटीक निर्देशिका से असेंबली लोड करने के लिए ServiceHost को कैसे बताना है। – NDeveloper

2

पीटर के पास एक सुझाव है। आकार के आधार पर और क्या आप इसे वारंट कर सकते हैं, दूसरा, आपके बुनियादी ढांचे को कम से कम 2 क्लस्टर सर्वर पर ले जाना है। यह आपको एक समय में एक को अपडेट करने की अनुमति देता है, जबकि अन्य (अनुरोध) अनुरोध लेते रहते हैं। जब तक आप ठीक से संस्करण (अनुबंध में परिवर्तन == नई विधि), यह पद्धति अच्छी तरह से काम करती है, क्योंकि पुराने क्लाइंट आपके नए बिट्स के बावजूद एक ही डेटा प्राप्त करना जारी रखते हैं।

+0

हां क्लस्टर सर्वर एक व्यावहारिक समाधान हो सकता है, लेकिन मुझे सेवा के बिना बदले में बदले में दिलचस्पी है, चाहे कोई आउटेज हो या नहीं। – NDeveloper

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