使用.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工作器方式
使用.NET Core建立Windows服務
- 使用微軟推薦方式
- 使用
Topshelf
方式
安裝步驟
這裡首先你要確保你已經安裝了.NET Core 3.0或以上版本。在我編寫這篇文章的時候, .NET Core 3.1剛剛釋出,Visual Studio應該會提示你升級到最新版本。但是如果你想要在.NET Core 2.x專案中使用這個方式,應該是行不通的。
如果你喜歡使用命令列建立專案,你就需要使用工作器(worker)型別建立專案:
dotnet new worker
如果你是一個和我一樣喜歡使用Visual Studio的開發人員,那麼你可以在Visual Studio中使用專案模板完成相同的功能。
這樣做將創建出一個包含兩個檔案的專案。其中Program.cs
檔案是應用的啟動“載入程式”。另外一個檔案是worker.cs
檔案,在這個檔案中,你可以編寫你的服務邏輯。
這看起來應該是相當的容易,但是為這個程式新增額外的並行後臺服務,你還需要新增一個類,並讓它繼承BackgroundService
類:
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來執行程式,看看我們能得到什麼。
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 TestServicesc stop TestServicesc 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工作器,大家可以自行選擇,都是不錯的方案