.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/

相关文章
相关标签/搜索