[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务
原文: .NET Core Workers as Windows Services
在 .NET Core 3.0 中,我们引入了一种名为 Worker Service 的新型应用程序模板。此模板旨在为您在 .NET Core 中编写长时间运行的服务的提供一个起点。在本演练中,我们将创建一个 worker 并将其作为 Windows 服务运行。
创建一个 Worker
注意:在我们的预览版中,worker 模板与 Web 模板位于同一级菜单中。这将在未来的版本中发生变化。我们打算将 Worker Service 模板直接放在“创建新项目”菜单中。
在 Visual Studio 中创建 Worker



在命令行中创建 Worker
运行 dotnet new worker

作为 Windows 服务运行
为了作为 Windows 服务运行,我们需要我们的 worker 监听来自 ServiceBase 的启动停止信号,该类型将 Windows 服务系统暴露给 .NET 应用程序。要做到这一点,我们希望:
添加 Microsoft.Extensions.Hosting.WindowsServices NuGet 包

在 Program.cs 的 HostBuilder 中添加对 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 服务运行时。您不需要向其添加保护语句,只需在未作为 Windows 服务安装时正常运行应用程序即可。
其次,它将配置 host 使用 ServiceBaseLifetime。 ServiceBaseLifetime 与 ServiceBase 一起使用,以帮助控制作为 Windows 服务运行时应用程序的生命周期。这会覆盖处理 CTRL + C 等信号的默认的 ConsoleLifetime 。
安装 Worker
一旦我们的 worker 使用 ServiceBaseLifetime,我们就需要安装它:
首先,让我们发布应用程序。如果我们立刻安装了 Windows 服务,这意味着只要服务运行,exe 就会被锁定。发布这一步是个很好的方法, 以确保我需要运行服务的所有文件都在一个位置, 并准备好安装。
dotnet publish -o c:\code\workerpub
然后我们就可以在命令行中使用 sc 命令来安装
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
例如:

安全说明:此命令将服务使用 local system 运行,这通常不是您想要做的事情。相反,您应该创建一个服务帐户并以该帐户运行 Windows 服务。我们不会在这里讨论这个问题,但是有一些文档在这里讨论它: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.2
日志
日志记录系统有 Event Log 的提供程序,可以将日志消息直接发送到 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>();
});
未来工作
在即将到来的预览版中,我们计划通过以下方式改善使用 Worker 的体验:
- 将 UseWindowsServiceBaseLifetime 重命名为 UseWindowsService
- 作为 Windows 服务运行时,自动的集成 Event Log 日志。
结论
我们希望您试用这个新模板,并希望您告诉我们它有什么问题,您可以在此处提出任何错误或建议:
https://github.com/aspnet/AspNetCore/issues/new/choose
译者注
原文作者在评论中提到,下一篇文章将讲解如何在 Linux/Unix 中创建服务
[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务的更多相关文章
- 为MongoDB创建一个Windows服务
一:选型,根据机器的操作系统类型来选择合适的版本,使用下面的命令行查询机器的操作系统版本 wmic os get osarchitecture 二:下载并安装 附上下载链接 点击安装包,我这里是把文件 ...
- tomcat创建一个windows服务
具体步骤如下: 1.把JDK解压到C:\Program Files\Java下,Tomcat解压到D:\tomcat下 2.配置环境变量 JAVA_HOME:C:\Program Files\Java ...
- 【原创】使用.NET Core 1.0创建一个Self-Contained控制台应用
开发机器:win7-x64 .NET Core版本:1.0.0-preview2-003121 Visual Studio Code:1.2.1 至于什么是Self-Contained应用类型以及与P ...
- 创建第一个windows服务
windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志. 计算机启动时,服务会自动开 ...
- .Net Core .Net Core V1.0 创建MVC项目
.Net Core V1.0 创建MVC项目 创建MVC项目有两种方式: 一.创建Web项目:(有太多没用的东西要去删太麻烦) 2.项目目录结构: 此种方法要注意的是,会创建好多个json文件,下面就 ...
- 【故障公告】数据库服务器 CPU 近 100% 引发的故障(源于 .NET Core 3.0 的一个 bug)
非常抱歉,这次故障给您带来麻烦了,请您谅解. 今天早上 10:54 左右,我们所使用的数据库服务(阿里云 RDS 实例 SQL Server 2016 标准版)CPU 突然飙升至 90% 以上,应用日 ...
- C#创建、安装一个Windows服务
关于WIndows服务的介绍,之前写过一篇: http://blog.csdn.net/yysyangyangyangshan/article/details/7295739.可能这里对如何写一个服务 ...
- 创建一个Windows服务程序与实现定时器效果
1.创建一个Windows服务程序 一. 新建Window服务项目 二. 添加安装程序 三. 配置服务属性 四. 编写定时器代码 publicpartialclassService1 ...
- C#创建一个Windows Service
Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...
随机推荐
- <自动化测试方案_2>第二章、自动化测试是什么?(What)
第二章.自动化测试是什么?(What) 自动化测试是相对于手工测试而言:通过脚本自动去执行测试用例,从而代替人完成测试工作. 自动化测试相对手工测试优缺点 测试方式 优点 缺点 手工测试 1,完整的对 ...
- 章节二、4-String以及StringBuffer和StringBuilder的对比
1.String---字符串常量 字符串是一个常量,一旦被初始化就不会被改变,它存储在字符串常量池中,每一个字符串对象在java中都是线程安全的. 2.StringBuffer---字符串变量 是 ...
- 通过UNIX域套接字传递描述符的应用
传送文件描述符是高并发网络服务编程的一种常见实现方式.Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现.本文详细说明一下传送文件描述符的应用. 1. TCP服务器程 ...
- NoSQL与MongoDB介绍
写在前面 本文是由一次演讲整理出来的,文中大部分资料来源于网络,感谢Wikipedia,Google和MongoDB官网.文中使用的MongoDB版本为1.2.4. What is NoSQL NoS ...
- 后台登录(包含验证码)的php代码实现
login.html文件 <html> <title>login in</title> <body> <form action="han ...
- org.springframework.dao.InvalidDataAccessResourceUsageException: Unexpected cursor position change. Spring Batch 错误
在用SpringBatch 跑job的时候出现这个错误, 由于取数据的DB 是netezza, 框架可能支持的不是很全面,当然也可能是其他原因. <bean id="reader_rd ...
- nuxt项目部署
前提: linux服务器 一.安装node ① 下载 cd /usr/local/src/ wget https://nodejs.org/dist/v10.11.0/node-v10.11.0-l ...
- 超简单的gif图制作工具
测试成功了: 软件灵者Gif录制1.0 使用方法注意: 扩展: 安卓端想要制作gif可参考此方法(还没测试):https://blog.csdn.net/u012604745/article/deta ...
- Celery 异步任务
Celery https://www.cnblogs.com/DragonFire/p/10356615.html 介绍: Celery 是芹菜 Celery 是基于Python实现的模块, 用于执行 ...
- WPF自定义控件(一)の控件分类
一.什么是控件(Controls) 控件是指对数据和方法的封装.控件可以有自己的属性和方法,其中属性是控件数据的简单访问者,方法则是控件的一些简单而可见的功能.控件创建过程包括设计.开发.调试(就是所 ...