[料理佳餚] 用 .NET Core Worker Service 在 Linux 及 Windows 上建置背景服務

以往用 .NET Framework 開發的時候,都是用 TopShelf 來建置 Windows 服務,現在 .NET Core 弄了一個叫 .NET Generic Host 的東西,我們可以直接將服務透過它來 Host 成背景服務,而且它是跨平台的,不只可以部署在 Windows 上,Linux 上也行得通,ASP.NET Core 應用程式就是用它來讓服務可以長時間執行。

建立 Worker Service 專案

打開 Visual Studio 2019,在建立專案的畫面上,選擇「服務」,我們就可以看到 Worker Service 的專案範本。

建立好專案之後,我們可以看到專案範本已經為我們寫好基本的使用方式,只要把我們的服務繼承 BackgroundService,覆寫 ExecuteAsync() 方法,然後把我們的服務執行邏輯寫在裡面,接著透過 AddHostedService<THostedService>() 把它交給 .NET Generic Host 幫我們 Host 起來。

註冊成 Linux 的背景服務

為了讓服務看起來有跑,我在 ExecuteAsync() 方法中多加幾行程式碼,定期寫入一些文字到一個檔案。

我們先安裝 Microsoft.Extensions.Hosting.Systemd 套件,然後在 CreateDefaultBuilder() 方法後面再接 UseSystemd() 方法。

接著我們在 /usr/lib/systemd/system/ 路徑底下建立服務檔,內容如下:

[Unit]
Description=WorkerServiceLab Test Service

[Service]
WorkingDirectory=/home/user/WorkerServiceLab/
ExecStart=/home/user/WorkerServiceLab/WorkerServiceLab
User=user

[Install]
WantedBy=multi-user.target

好了之後,我們就可以下指令,把服務執行起來。

sudo systemctl start WorkerServiceLab

註冊成 Windows Service

要註冊成 Windows Service,我們需要安裝一個套件 - Microsoft.Extensions.Hosting.WindowsServices,安裝好之後,在 CreateDefaultBuilder() 方法後面再接 UseWindowsService() 方法。

接著,我們就可以用 sc 指令建立 Windows Service。

sc.exe create ServiceName binpath="..."

參考資料

C# 指南 ASP.NET 教學 ASP.NET MVC 指引
Azure SQL Database 教學 SQL Server 教學 Xamarin.Forms 教學