.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操做系統。git

Worker Service項目github

在VisualStudio 2019中建立新的Worker Service項目的最快方法是使用最新模板。還能夠使用適當的DotNetCLI命令。後端

啓動VisualStudio並選擇Worker Service模板,以下所示:瀏覽器

要使用命令行,使用如下命令,-o是一個可選標誌,用於爲項目提供輸出文件夾名:async

dotnet new worker -o myproject

程序和後臺服務ide

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>();
      });
 }

要注意的事情:ui

1. Main方法調用CreateHostBuilder()方法,並運行它。spa

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的服務列表中:

 原文連接:https://wakeupandcode.com/worker-service-in-net-core-3-1/

相關文章
相關標籤/搜索