2010-09-12 8 views
27

निम्न लिंक में से एक, सी # कोड का उपयोग कर एक सेवा रोक सकता है, शुरू कर सकता है, और "रोक सकता है, फिर शुरू करें"।.NET कोड से .NET विंडोज सेवा में कस्टम कमांड कैसे भेजें?

http://www.csharp-examples.net/restart-windows-service/

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

लंबी कहानी छोटी - इससे पहले कि मैं इस OnSmartRestart कार्यक्षमता को लागू करने में कूदूं, मैं यह सुनिश्चित करना चाहता हूं कि इस कॉल को किसी अन्य C# एप्लिकेशन से आमंत्रित करने का एक आसान तरीका है।

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

अगर मुझे कुछ फाइल के लिए मतदान करना है या बंदरगाह खोलना है और ऐसा करने पर बहुत अधिक CPU खर्च करना है, तो यह एक अच्छा समाधान नहीं होगा। मैं इसे यथासंभव सरल रखना चाहता हूं (पुनरावृत्ति के लिए खेद है)।

उत्तर

48

आप ServiceController.ExecuteCommand का उपयोग कर एक सेवा करने के लिए "कमांड" भेज सकते हैं:

const int SmartRestart = 222; 

var service = new System.ServiceProcess.ServiceController("MyService"); 
service.ExecuteCommand(SmartRestart); 
service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

आप System.ServiceProcess.dll विधानसभा के लिए एक संदर्भ जोड़ने की आवश्यकता होगी।

सेवा ServiceBase.OnCustomCommand अधिभावी द्वारा आदेश पर प्रतिक्रिया कर सकते हैं: खिड़कियों में बाहरी प्रक्रियाओं के साथ संवाद स्थापित करने की

protected override void OnCustomCommand(int command) 
{ 
    if (command == SmartRestart) 
    { 
     // ... 
    } 
} 
+15

कुछ अतिरिक्त जानकारी: DOS SC.exe कमांड इन आदेशों को भी भेज सकता है, सुरक्षा अनुमतियों की अनुमति ... उदा। 'एससी नियंत्रण YOURSERVICENAME 200' – Adrian

+0

एड्रियन, यदि आपकी विधि एक विकल्प है, तो इसे सामान्यतः कमांड का उपयोग कैसे कहा जाता है? उपरोक्त स्रोत कोड में 222 के समान आपके आदेश में "200" है? – MacGyver

+1

ध्यान दें कि इसके लिए एक सामान्य सर्वर वातावरण में विशेष अनुमतियों की आवश्यकता है जहां आपका .NET ऐप/साइट अपने आप पर सीमित अनुमति उपयोगकर्ता चल रहा है। आप इस विधि का उपयोग कर इस सेवा को केवल एक ही सेवा में कस्टम आदेश भेजने की अनुमति देकर हल कर सकते हैं: http://i.imgur.com/tql3pUA.png http://superuser.com/a/315709/101698 –

12

सामान्य साधन हैं:

  1. नाम पाइप
  2. सॉकेट
  3. कॉम के किसी ऑब्जेक्ट का संदर्भ प्राप्त करने के लिए GetObject और उसके बाद खुला इंटरफ़ेस पर अपनी विधियों को कॉल करना।

पहले दो को डब्ल्यूसीएफ के रूप में उजागर किया गया है, इसलिए यह रास्ता है। तीसरा व्यक्ति आपकी स्थिति के लिए प्रासंगिक प्रतीत नहीं होता है और पुराना है।

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

+2

यदि आप पैरामीटर भेजने की योजना बना रहे हैं तो यह उत्तर बेहतर (और आवश्यक) है। –

+0

सामान्यतः, यह उत्तर किसी भी मामले के लिए बेहतर लगता है जहां आप "उपयोगकर्तालैंड" ऐप से आदेश लेना चाहते हैं, जो कि ओपी के मामले में प्रतीत होता है। डब्ल्यूसीएफ सेवा का उपयोग करने के लिए अनुमतियों के बारे में मकिंग की आवश्यकता नहीं है, जो सुरक्षित और अधिक सुविधाजनक हो सकता है। एक विंडोज सेवा से डब्ल्यूसीएफ सेवाओं की मेजबानी पर एक [एमएसडीएन लेख] भी है (https://msdn.microsoft.com/en-us/library/ms733069)। – ZX9

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