如何在ASP.Net Core中使用辅助服务
ASP.Net Core 3.0 Preview 3添加了对创建工作程序服务的支持,这些工作程序是诸如Windows服务和Linux守护程序之类的后台服务。 还有一个用于在Visual Studio中创建辅助服务的新模板。
要在Visual Studio中使用辅助服务,您应该在系统上安装ASP.Net Core 3.0和.Net Core 3.0运行时的beta版(预览版3或更高版本)。
[Microsoft .Net 5将.Net Framework和.Net Core结合在一起:了解.Net Standard和.Net Core的合并对开发人员意味着什么 。 | 从InfoWorld的Microsoft Architect博客中了解如何从.Net Framework和.Net Core中获得最大收益。 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]
创建一个新的工作人员服务应用程序
首先,让我们在Visual Studio 2019中创建一个ASP.Net Core项目。请按照以下步骤在Visual Studio中创建一个新的ASP.Net Core项目:
- 启动Visual Studio IDE。
- 单击创建新项目。
- 在“创建新项目”窗口中,从模板列表中选择“ ASP.Net Core Web应用程序”。
- 点击下一步。
- 在出现的“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 出现创建新ASP.Net Core Web应用程序窗口。
- 选择.Net Core作为运行时,并从顶部的下拉菜单中选择ASP.Net Core 3.0(或更高版本)。
- 选择Worker Service作为项目模板以创建新的Worker Service应用程序
- 确保未选中“启用Docker支持”复选框,因为此处不会使用此功能。
- 确保将“身份验证”设置为“无身份验证”,因为您也不会使用身份验证。
- 单击创建。
这将在Visual Studio中创建一个新的工作程序服务应用程序。
ASP.Net Core中的新工作程序服务。
程序类
Worker服务的默认实现包含两个类:Program和Worker类。 Program类类似于Web应用程序中的类,不同之处在于,您拥有一个Worker类而不是Startup类。 这是Program类的外观。 注意如何使用AddHostedService
方法。
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); }
工人阶级
Worker类为依赖项注入提供支持。 Worker服务类扩展了Microsost.Extensions.Hosting.Abstractions包中的BackgroundService类。 所述BackroundService抽象类扩展IHostedService接口和包含的声明StartAsync
, StopAsync
,和ExecuteAsync
方法。
public abstract class BackgroundService : IHostedService, IDisposable { public virtual void Dispose(); public virtual Task StartAsync(CancellationToken cancellationToken); public virtual Task StopAsync(CancellationToken cancellationToken); protected abstract Task ExecuteAsync(CancellationToken stoppingToken); }
Worker类的构造函数接受ILogger类型的实例作为参数。 以下代码段显示了Worker类的默认实现:
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync (CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation ("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
您可以将工作程序服务作为Visual Studio中的.exe文件运行,甚至可以作为Windows服务运行。 若要将工作程序服务作为Windows服务运行,应将Microsoft.Extensions.Hosting.WindowsServices NuGet包添加到项目中。
您可以像在Visual Studio中运行应用程序一样来运行worker服务:按F5或Ctrl + F5。 当您运行简约工作程序服务时,该图显示了输出结果。
扩展默认工作程序服务
您可以重写BackgroundService
抽象类的方法,以向工作程序服务添加更多功能。 您可以重写ExecuteAsync
方法以编写用于执行任何长时间运行的任务的代码。 以下代码显示了Worker类的增强版本; 在StartAsync
, ExecuteAsync
和StopAsync
方法已经实施。
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } public override Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation ("Worker service has been started at: {0}", DateTime.Now); return base.StartAsync(cancellationToken); } protected override Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation ("Worker service running at: {0}", DateTime.Now); return Task.CompletedTask; } public override Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation ("Worker service has been stopped at: {0}", DateTime.Now); return base.StopAsync(cancellationToken); } public override void Dispose() { _logger.LogInformation ("Worker service has been disposed at: {0}", DateTime.Now); base.Dispose(); } }
在工作者服务中记录数据
要在辅助服务中使用日志记录,应添加对Microsoft.Extensions.Logging程序集的引用。 辅助服务中的默认记录器为ConsoleLogger。 您还可以将EventLog用作辅助服务中的日志目标。 要将EventLog用作日志目标,请将Microsoft.Extensions.Logging.EventLog NuGet包添加到您的项目中。
以下代码段说明了如何在Program类的CreateHostBuilder方法中将日志记录输出配置为事件日志:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logFactory => logFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
From: https://www.infoworld.com/article/3432096/how-to-work-with-worker-services-in-aspnet-core.html