2012-11-06 163 views
2

我有一個自我託管的wcf服務,它使用傳統C++代碼通過dll導入和pinvoke。舊代碼中有一些實例(函數在舊應用程序中處理,但未在服務中處理)發生異常,並且當它們發生時,我的服務正在停止。例外情況很少;然而,我不希望我的服務由於另一個程序集崩潰而被隨機停止。例外情況不會冒泡服務,所以我不能在服務中嘗試/捕獲它們。有沒有辦法自動讓服務在崩潰時重新啓動?在崩潰時自動重啓自我託管的wcf服務

它是自我託管的,不是通過IIS。

在此先感謝!

回答

4

在所在的機器服務正在運行,你可以打開服務管理控制檯(開始>運行> Services.msc)中。找到您的服務,右鍵單擊它並選擇「屬性」。在彈出窗口中,點擊恢復標籤。將第一個,第二個和後續故障設置爲重新啓動服務。

如果您使用WIX安裝項目,也可以使用util:ServiceConfig元素設置這些屬性。

如果您使用的是標準的ServiceInstaller,這些選項都沒有內置的。我建議有一個看ServiceInstaller Extension類通過標準的服務安裝接口公開屬性。

+0

完美,謝謝!!! – spyter

1

嗯,我假設你正在創建一個Windows服務項目,你正在做什麼。進入你的ProjectInstaller並找到「AfterInstall」方法。在這裏您需要添加代碼以在服務控制器上執行命令來設置恢復選項。不幸的是,即使.NET有一個ServiceController,你也需要通過一個進程啓動來執行命令。

using (var process = new Process()) 
{ 
    var startInfo = process.StartInfo; 
    startInfo.FileName = "sc"; 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 

    // tell Windows that the service should restart if it fails 
    startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName); 

    process.Start(); 
    process.WaitForExit(); 

    exitCode = process.ExitCode; 

    process.Close(); 
} 

注:我這個代碼another question