使用.NET Core建立Windows服務(二) - 使用Topshelf方式

原文:Creating Windows Services In .NET Core – Part 2 – The 「Topshelf」 Way
做者:Dotnet Core Tutorials
譯者:Lamond Lu
譯文:使用.NET Core建立Windows服務(二) - 使用Topshelf方式html

使用.NET Core建立Windows服務shell


在前一篇文章中,我給你們介紹了,如何基於微軟推薦方式使用.NET Core建立Windows服務。咱們發現使用這種方式,咱們很容易就能夠搭建和運行一個Windows服務,可是問題是使用這種方式,代碼調試將很是困難。c#

那麼如今就是Topshelf出場的時候了。Topshelf是一個.NET Standard庫,它消除了在.NET Framework和.NET Core中建立Windows服務的那些麻煩。api

安裝

與微軟推薦方式相似,這裏Visual Studio並無提供一個基於Topshelf建立Windows服務的模板,因此咱們依然須要經過建立普通控制檯程序的方式,來建立一個Windows服務。app

而後,咱們須要經過Package Manager Console, 運行如下命令,安裝Topshelf類庫。學習

Install-Package Topshelf

代碼

下面咱們就來使用Topshelf重構以前的服務代碼。命令行

public class LoggingService : ServiceControl
{
    private const string _logFileLocation = @"C:\temp\servicelog.txt";
 
    private void Log(string logMessage)
    {
        Directory.CreateDirectory(Path.GetDirectoryName(_logFileLocation));
        File.AppendAllText(_logFileLocation, 
            DateTime.UtcNow.ToString() + " : " + logMessage + Environment.NewLine);
    }
 
    public bool Start(HostControl hostControl)
    {
        Log("Starting");
        return true;
    }
 
    public bool Stop(HostControl hostControl)
    {
        Log("Stopping");
        return true;
    }
}

代碼看起來是否是很簡單?調試

這裏咱們的服務類繼承了ServiceControl類(實際上並不須要,可是這能夠爲咱們的工做打下良好的基礎)。咱們必須實現服務開始和服務結束兩個方法,而且像之前同樣記錄日誌。日誌

Program.cs文件的Main方法中,咱們要寫的代碼也很是的簡單。咱們能夠直接使用HostFactory.Run方法來啓動服務。code

static void Main(string[] args)
{
    HostFactory.Run(x => x.Service<LoggingService>());
}

這看起來真是太簡單了。但這並非HostFactory類的惟一功能。這裏咱們還能夠設置

  • 服務的名稱
  • 服務是否自動啓動
  • 服務崩潰以後的重啓時間
static void Main(string[] args)
{
    HostFactory.Run(x =>
        {
            x.Service<LoggingService>();
            x.EnableServiceRecovery(r => r.RestartService(TimeSpan.FromSeconds(10)));
            x.SetServiceName("TestService");
            x.StartAutomatically();
         }
    );
}

這裏其實能說的東西不少,可是我建議你仍是本身去看看Topshelf的文檔,學習一下其餘的配置選項。基本上你能使用Windows命令行完成的全部操做,均可以使用代碼來設置: https://topshelf.readthedocs.io/en/latest/configuration/config_api.html

部署服務

和以前同樣,咱們須要針對不一樣的Windows環境發佈咱們的服務。在Windows命令提示符下,咱們能夠在項目目錄中執行如下命令:

dotnet publish -r win-x64 -c Release

如今咱們就能夠查看一下bin\Release\netcoreappX.X\win-x64\publish目錄,咱們會發現一個編譯好的exe,下面咱們就會使用這個文件來安裝服務。

在上一篇文章中,咱們是使用SC命令來安裝Windows服務的。使用Topshelf咱們就不須要這麼作了,Topshelf提供了本身的命令行參數來安裝服務。基本上使用代碼能完成的配置,均可以使用命令行來完成。

你能夠查看相關的文檔:

<http://docs.topshelf-project.com/en/latest/overview/commandline.html>

WindowsServiceExample.exe install

這裏WindowsServiceExample.exe是我發佈以後的exe文件。運行以上命令以後,服務應該就正常安裝了!這裏有一個小問題,我常常發現,即便配置了服務自動啓動,可是服務安裝以後,並不會觸發啓動操做。全部在服務安裝以後,咱們還須要經過如下命令來啓動服務。

WindowsServiceExample.exe start

在生產環境部署的時候,個人經驗是在安裝服務以後,等待10秒鐘,再啓動服務。

調試服務

當咱們是使用微軟推薦方式的時候,咱們會遇到了調試困難的問題。大多數狀況下,不管是否在服務內部運行,咱們都不得不使用命令行標誌、#IF DEBUG指令或者配置值來實現調試。而後使用Hack的方式在控制檯程序中模擬服務。

所以,這就是爲何咱們要使用Topshelf

若是咱們的服務代碼已經在Visual Studio中打開了,咱們就能夠直接啓動調試。Topshelf會模擬在控制檯中啓動服務。咱們應該能在控制檯中看到如下的消息。

The TestService service is now running, press Control+C to exit.

這確實符合了咱們的需求。它啓動了咱們的服務,並像真正的Windows服務同樣在後臺運行。咱們能夠像往常同樣設置斷點,基本上它遵循的流程和正常安裝的服務同樣。

咱們能夠經過ctrl+c, 來關閉咱們的應用,可是在運行服務執行Stop方法以前,它是不能被關閉的,這使咱們能夠調試服務的關閉流程。與調試指令和配置標誌相比,這要容易的多。

這裏須要注意一個問題。若是你收到的如下內容的消息:

The TestService service is running and must be stopped before running via the console

這意味着你嘗試調試的服務實際上已經做爲Windows服務被安裝在系統中了,你須要中止(不須要卸載)這個正在運行的服務,才能夠正常調試。

後續

在上一篇中,有讀者指出.NET Core中實際上已經提供了一種徹底不一樣的方式運行Windows服務。它的實質是利用了ASP.NET Core中引入的「託管服務」模型,並容許它們做爲Windows服務來運行,這真的是很是的棒。

相關文章
相關標籤/搜索