使用.NET Core建立Windows服務 - 使用.NET Core工做器方式

原文:Creating Windows Services In .NET Core – Part 3 – The 「.NET Core Worker」 Way
做者:Dotnet Core Tutorials
譯者:Lamond Lu
譯文:使用.NET Core建立Windows服務 - 使用.NET Core工做器方式html

使用.NET Core建立Windows服務linux


安裝步驟

這裏首先你要確保你已經安裝了.NET Core 3.0或以上版本。在我編寫這篇文章的時候, .NET Core 3.1剛剛發佈,Visual Studio應該會提示你升級到最新版本。可是若是你想要在.NET Core 2.x項目中使用這個方式,應該是行不通的。shell

若是你喜歡使用命令行建立項目,你就須要使用工做器(worker)類型建立項目:c#

dotnet new worker

若是你是一個和我同樣喜歡使用Visual Studio的開發人員,那麼你能夠在Visual Studio中使用項目模板完成相同的功能。windows

這樣作將建立出一個包含兩個文件的項目。其中Program.cs文件是應用的啓動「引導程序」。另一個文件是worker.cs文件,在這個文件中,你能夠編寫你的服務邏輯。框架

這看起來應該是至關的容易,可是爲這個程序添加額外的並行後臺服務,你還須要添加一個類,並讓它繼承BackgroundService類:ide

public class MyNewBackgroundWorker : BackgroundService
{    
    protected override Task ExecuteAsync(CancellationToken stoppingToken)    
    {        
        //Do something.     
    }
 }

而後在Program.cs中,咱們要作的只是把當前的Worker註冊到服務集合(Service Collection)中便可。學習

.ConfigureServices((hostContext, services) =>
{
    services.AddHostedService<Worker>();
    services.AddHostedService<MyNewBackgroundWorker>();
});

實際上做爲「後臺服務」任務的運行程序,AddHostedService方法已經在框架中存在了很長時間了。在以前咱們已經完成的一篇關於ASP.NET Core託管服務的文章, 可是在當時場景中,咱們託管是是整個應用,而非一個在你應用程序幕後運行的東西。網站

運行/調試咱們的應用

在默認的工做器(worker)模板中,已經包含了一個後臺服務,這個服務能夠將當前時間輸出到控制檯窗口。下面讓咱們點擊F5來運行程序,看看咱們能獲得什麼。ui

info: CoreWorkerService.Worker[0]      
      Worker running at: 12/07/2019 08:20:30 +13:00
info: Microsoft.Hosting.Lifetime[0]      
      Application started. Press Ctrl+C to shut down.

在咱們啓動程序以後,程序馬上就運行了!咱們能夠保持控制檯的打開狀態來調試應用,或者直接關閉窗口退出。相較於使用"Microsoft"方式來調試一個Windows服務,這簡直就是天堂。

這裏咱們須要注意的另一件事情是編寫控制檯程序的平臺。在最後,咱們不只在控制檯窗口輸出了時間,還經過依賴注入建立了一個託管worker. 咱們也可使用依賴注入容器來注入倉儲,配置環境變量,獲取配置等。

但這裏咱們尚未作的事情是,將這個應用轉換爲Windows服務。。

將咱們的應用轉換成Window服務

爲了將應用轉換成Windows服務,咱們須要使用以下命令引入一個包。

Install-Package Microsoft.Extensions.Hosting.WindowsServices

下一步,咱們須要修改Program.cs文件,添加UseWindowsService()方法的調用。

public static IHostBuilder CreateHostBuilder(string[] args) => 
    Host.CreateDefaultBuilder(args)    
        .ConfigureServices((hostContext, services) =>    
        {        
            services.AddHostedService<Worker>();   
         })
         .UseWindowsService();

以上就是全部須要變動的代碼。

運行咱們的程序,你會發現和以前的效果徹底樣。可是這裏最大的區別是,咱們能夠將當前應用以Windows服務的形式安裝了。

爲了實現這一目的,咱們須要發佈當前項目。在當前項目目錄中,咱們能夠運行如下命令:

dotnet publish -r win-x64 -c Release

而後咱們就能夠藉助標準的Windows服務安裝器來安裝當前服務了。

sc create TestService BinPath=C:\full\path\to\publish\dir\WindowsServiceExample.exe

當前,你也可使用Windows服務安裝器的其餘命令。

sc start TestService
sc stop TestService
sc delete TestService

最後檢查一下咱們的服務面板。

服務已經正常工做了。

在Linux中運行服務

老實說,我沒有太多的Linux經驗,可是終歸是須要了解一下...

在Linux系統中, 若是你但願咱們編寫的「Windows」服務在Linux系統中做爲服務運行,你須要作如下2步:

  • 使用Microsoft.Extensions.Hosting.Systemd替換以前的Microsoft.Extensions.Hosting.WindowsServices
  • 使用UseSystemd()替換UseWindowsService()

Microsoft vs Topshelf vs .NET Core Workers

到如今爲止,咱們已經介紹了藉助3種不一樣的方式來建立Windows服務。

你可能會問「好吧,那我到底應該選擇哪種?」

這裏呢,咱們能夠首先把"Microsoft"這種老派學院式的方式拋棄。覺得它的調試實在是太麻煩了,並且沒有什麼實際的用處。

而後剩下的就是Topshelf和.NET Core工做器兩種方式了。在我看來,.NET Core工做器,已經很好的融入.NET Core生態系統,若是你正在開發ASP.NET Core應用,那麼使用.NET Core工做器就頗有意義。最重要的是,當你建立一個後臺服務的時候,你可讓它在一個ASP.NET Core網站中的任意位置運行,這很是的方便。可是缺點是安裝。你必須使用SC命令來安裝服務。這一部分Topshelf可能更勝一籌。

Topshelf整體上將很是的友好,而且具備最好的安裝方式,可是使用額外的庫,也增長了學習的成本。

因此Topshelf和.NET Core工做器,你們能夠自行選擇,都是不錯的方案。

相關文章
相關標籤/搜索