2010-09-12 61 views
27

如下面的鏈接,可以使用C#代碼停止,啓動和「停止,然後啓動」服務。如何將自定義命令從.NET代碼發送到.NET Windows服務?

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

我紛紛出爐,它實現OnStartOnStop一個.NET服務。但是,我需要實現一個「智能重啓」功能,而不僅僅是停止然後開始。如果需要,我需要將停機時間保持在幾秒鐘(但是在這種情況下,停止+啓動可能需要幾分鐘時間,並且我必須乾淨地完成),並且讓系統的某些部分可用,而其他人則可以重新啓動/刷新。長篇小說 - 在我開始實施OnSmartRestart功能之前,我想確保從另一個C#應用程序中調用此調用的方法相當簡單。

此功能很重要,但很危險。我想讓它隱藏起來,有點安全,也保持簡單,並且確保這對我的Windows服務在執行常規任務時不影響性能,而不是重新啓動。

如果我不得不輪詢某個文件或打開一個端口,並花費太多的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命令也可以發送這些命令,安全權限允許...例如。 'SC CONTROL YOURSERVICENAME 200' – Adrian 2012-12-13 13:46:18

+0

Adrian,如果您的方法是替代方法,通常如何使用命令調用它?你的命令中的「200」類似於上面源代碼中的222嗎? – MacGyver 2015-11-24 08:45:11

+1

請注意,這需要在您的.Net應用/網站獨立運行的典型服務器環境中具有特殊權限的有限權限用戶。您可以通過向該用戶授予使用此方法發送自定義命令的權限來解決該問題:http://i.imgur.com/tql3pUA.png http://superuser.com/a/315709/101698 – 2016-03-23 14:54:59

12

通常的裝置是:

  1. 命名管道
  2. 套接字
  3. COM的GetObject獲取對象的引用,然後通過公開的接口調用其方法。

前兩個已經公開爲WCF,所以這是要走的路。第三個與你的情況似乎不相關,並且是舊的。

如果你需要從同一臺機器上運行你的命令,你可以使用命名管道,但硬化使它非常困難和麻煩。否則使用WCF的TCP命名綁定。

+2

如果您計劃發送參數,此答案優越(並且是必需的)。 – 2013-09-03 00:49:16

+0

一般來說,對於任何需要從「用戶空間」應用程序獲取命令的情況,這個答案似乎都很優秀,這似乎是OP的情況。使用WCF服務不需要使用權限,這可能會更安全,更方便。還有一個[有關從Windows服務託管WCF服務的MSDN文章](https://msdn.microsoft.com/zh-cn/library/ms733069)。 – ZX9 2016-11-29 15:43:02

相關問題