詳解.NET Core中的Worker Service
當你想到ASP.NET Core時,可能會想到Web應用程序後端代碼,包括MVC和WebAPI。MVC視圖和Razor頁面還允許使用後端代碼生成帶有HTML元素的前端UI。全新的Blazor更進一步,允許使用WebAssembly在Web瀏覽器中運行客戶端.NET代碼。最後,我們現在有瞭一個Worker Service應用程序的模板。
這是在ASP.NET Core早期預覽中引入的。雖然項目模板最初列在Web模板下,但此後在向導中重新定位瞭一個級別。這是在.NET Core中創建長時間運行的跨平臺服務的好方法。本文介紹Windows操作系統。
Worker Service項目
在VisualStudio 2019中創建新的Worker Service項目的最快方法是使用最新模板。還可以使用適當的DotNetCLI命令。
啟動VisualStudio並選擇Worker Service模板,如下所示:
要使用命令行,使用以下命令,-o是一個可選標志,用於為項目提供輸出文件夾名:
dotnet new worker -o myproject
程序和後臺服務
Program.cs類包含Main()方法和CreateHostBuilder()方法。這可以在下面的片段中看到:
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>(); }); }
要註意的事情:
1. Main方法調用CreateHostBuilder()方法,並運行它。
2. 在ASP.NET Core中,WebHostBuilder將被Generic HostBuilder替代。
3. CreateHostBuilder()創建主機並通過調用AddHostService<T>
Worker.cs,定義如下:
public class Worker : BackgroundService { // ... protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // do stuff here } }
要註意的事情:
1. Worker類實現BackgroundService 類,它來自命名空間Microsoft.Extensions.Hoting
2. 然後,Worker類可以重寫ExecuteAsync()方法來執行任何長期運行的任務。
Worker Service 中使用Logging
若要在Worker Service項目中使用日志記錄,可以在Program.cs:
using Microsoft.Extensions.Logging; public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
1.在使用擴展方法之前,將其NuGet包添加到項目中:
Microsoft.Extensions.Logging.EventLog
2.將適當的命名空間添加到代碼中:
using Microsoft.Extensions.Logging;
3.調用方法ConfigreLogging()並調用適當的日志記錄方法,例如:AddEventLog()。
- AddConsole()
- AddDebug()
- AddEventLog()
- AddEventSourceLogger()
這個Worker類通過註入ILogger<Work>對象到構造函數中:
private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; }
運行Worker Service
在繼續之前,請將調用添加把UseWindowsService()添加到Program類或者確認它已經在那裡瞭。官方文檔中UseServiceBaseLifetime()在預覽版中。在新的版本此方法已重命名為UseWindowsService()中。
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices(services => { services.AddHostedService<Worker>(); });
根據代碼文檔,UseWindowsService()進行下列工作:
1. 將主機生存期設置為WindowsServiceLifetime
2. 設置 ContentRoot
3. 啟用以應用程序名稱作為默認名稱的事件日志記錄。
你可以以各種方式運行Worker Service:
1.在VisualStudio中生成和調試/運行。
2.發佈到exe文件並運行它
3.運行sc(從Windows\System 32)創建新服務
若要將Worker Service發佈為具有依賴關系的exe文件,請運行以下命令:
dotnet publish -o C:\path\to\project\pubfolder
-o參數可用於指定要生成已發佈文件的文件夾的路徑。它可以是指向項目文件夾的路徑,然後是一個新的子文件夾名,以保存已發佈的文件。
若要創建新服務,請運行sc.exe從System 32文件夾中傳入從發佈命令生成的exe文件的名稱。
> C:\Windows\System32\sc create MyServiceName binPath=C:\path\to\project\pubfolder\MyProjectName.exe
當手動運行服務時,你將看到以下的日志輸出:
info: WorkerServiceSample.Worker[0] Making doc 1 at: 06/09/2019 00:09:52 -04:00Making your document... info: WorkerServiceSample.Worker[0] Making doc 2 at: 06/09/2019 00:10:05 -04:00Making your document... info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development
服務安裝完成後,會出現在Windows的服務列表中:
以上就是詳解.NET Core中的Worker Service的詳細內容,更多關於.NET Core中的Worker Service的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- .NET 中Worker Service的使用入門
- .NET Core使用Worker Service創建服務
- 修改 asp.net core 5 程序的默認端口號
- Asp.net core程序中使用微軟的依賴註入框架
- 在ASP.Net Core中使用Lamar的全過程