在.NET Core 3.0中,我们引入了一种称为“工作者服务”的新型应用程序模板。 该模板旨在为您提供一个在.NET Core中编写长期运行的服务的起点。 在本演练中,我们将创建一个工作程序并将其作为Windows服务运行。

创建一个工人
预览注意:在我们的预览版本中,工作程序模板与Web模板位于同一菜单中。 这将在将来的版本中更改。 我们打算将Worker Service模板直接放置在create new project向导中。
在Visual Studio中创建工作程序



在命令行上创建一个Worker
运行dotnet new worker

作为Windows服务运行
为了作为Windows服务运行,我们需要我们的工作人员侦听来自ServiceBase
的.NET类型的启动和停止信号,该信号将Windows Service系统公开给.NET应用程序。 为此,我们要:
添加Microsoft.Extensions.Hosting.WindowsServices
NuGet程序包

在我们的Program.cs中将UseServiceBaseLifetime
调用添加到UseServiceBaseLifetime
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceBaseLifetime() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); }
此方法可以完成几件事。 首先,它检查应用程序是否实际上作为Windows服务运行。 您无需向其添加保护子句,并且在未作为Windows服务安装时可以正常运行该应用程序。
其次,它将主机配置为使用ServiceBaseLifetime
。 ServiceBaseLifetime
与ServiceBase
一起使用可帮助控制作为Windows Service运行的应用程序的生命周期。 这将覆盖处理诸如CTL + C之类的信号的默认ConsoleLifetime
。
安装工人
一旦我们让工作人员使用ServiceBaseLifetime
我们就需要安装它:
首先,让我们发布应用程序。 我们将就地安装Windows Service,这意味着只要该服务运行,exe就会被锁定。 发布步骤是确保我运行该服务所需的所有文件都在一个地方并可以安装的好方法。
dotnet publish -oc:\code\workerpub
然后,我们可以在admin命令提示符下使用sc实用程序
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
例如:

安全说明:此命令使服务作为本地系统运行,这不是您通常要执行的操作 。 相反,您应该创建一个服务帐户并以该帐户身份运行Windows服务。 我们不会在这里讨论,但是在ASP.NET文档上有一些文档在这里讨论: https : //docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-服务?视图= aspnetcore-2.2
记录中
日志记录系统具有事件日志提供程序,可以将日志消息直接发送到Windows事件日志。 要登录到事件日志,可以添加Microsoft.Extensions.Logging.EventLog
程序包,然后修改Program.cs
:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
未来的工作
在接下来的预览中,我们计划通过以下方法来改善将Workers与Windows Services结合使用的体验:
- 将UseWindowsServiceBaseLifetime重命名为UseWindowsService
- 作为Windows服务运行时,添加与事件日志的自动集成和改进的集成。
结论
我们希望您尝试这个新模板并希望让我们知道它的运行方式,您可以在此处提交任何错误或建议: https : //github.com/aspnet/AspNetCore/issues/new/choose
