Worker Service in ASP .NET Core
介紹
提到 ASP.NET Core,我們多半會想到 ASP.NET MVC、ASP.NET Web API、Razor page 及 Blazor。隨著 .NET Core 3.0 的推出,今天會介紹一個全新推出的功能:Work Service 。我們可以在 Visual Studio 2019 中通過預定的專案模版快速建立一個 WorkService專案。
或者使用 .NET CLI:
> dotnet new worker -o myWorkServiceProject
-o 是一個可選標誌,用於指定專案輸出資料夾名稱。關於 Work Service 模版的更多資訊可以參考:WorkService。
示例
首先我們建立一個 .NET Core 控制檯程式。
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); }
注意事項:
- 從 ASP.NET Core 3.0 起 WebHost 將被更通用的 Host 取代。
- CreateHostBuilder 建立主機並在 ConfigureServices 中呼叫 AddHostedService<T> 來配置它。
Worker 類繼承了 BackgroundService 下面貼出程式碼:
public class Worker : BackgroundService { // ... protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // do stuff here } }
我們可以通過 override ExecuteAsync 來完成自己要做的事情。
接下來我們新增一個日誌元件,用於記錄日誌:
using Microsoft.Extensions.Logging;
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
新增完日誌元件後,我們可以在 Worker 類的建構函式中注入日誌記錄器:
private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { this._logger = logger; }
執行
注意:我們需要以管理員模式開啟 Powershell 或 cmd 視窗。在執行之前我們需要在入口新增或確認有對 UseWindowsService() [早期此方法的名稱是:UseServiceBaseLifetime()]的呼叫:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices(services => { services.AddHostedService<Worker>(); });
可通過給 UseWindowsService 方法傳遞引數設定 Windows 服務。
釋出
dotnet publish -o C:\path\to\project\pubfolder
將程式釋出到 pubfolder 資料夾中以後,我們開始通過 sc.exe 建立 Windows 服務。
> C:\Windows\System32\sc create MyServiceName binPath=C:\path\to\project\pubfolder\MyProjectName.exe
服務建立完成後,它會出現在Windows 服務列表中,當我們手動啟動服務時,應該會看到日誌的輸出:
info: WorkerServiceSample.Worker[0] Making doc 1 at: 06/09/2019 00:09:52 -04:00 Making your document... info: WorkerServiceSample.Worker[0] Making doc 2 at: 06/09/2019 00:10:05 -04:00 Making your document... info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development
注意:在非 Windows 平臺上呼叫 UseWindowsService 方法也是不會報錯的,非 Windows 平臺會忽略此呼叫。
以上就是介紹的全部內容了。如果想用 .NET Core 開發 Windows 服務的,不防試試