【发布时间】:2021-01-05 20:08:51
【问题描述】:
我使用 BackgroundService 工作线程在 .NET Core(也在 .NET 5 中)创建了一个 Windows 服务,并使用 IHostBuilder.UseWindowsService() 调用将其作为 Windows 服务运行。
我的问题是,我如何捕获 Windows 服务命令,例如
sc.exe control <my service name> 200
据我所知,我无法以这种构建 Windows 服务的新方式捕获与旧的 ServiceBase.OnCustomCommand 等效的东西。
任何有关如何捕获这些命令的帮助将不胜感激。即使答案只是“回到为您的 Windows 服务使用 ServiceBase”。
谢谢!
【问题讨论】:
-
这两个类根本不等价。
BackgroundService不用于创建 Windows 服务。它旨在在 Web 应用程序、控制台应用程序等中运行长时间运行的操作。 -
Windows 服务是一种托管可执行文件的特定方式。在使用 Worker 项目模板时创建 Windows 服务,添加 Microsoft.Extensions.Hosting.WindowsServices 包并使用
.UseWindowsService()as shown here。对于 Linux,您将使用相同的包和UseSystemd() -
如果你想向你的服务发送命令,你可以create an HTTP endpoint监听请求。这将允许您发出比 Windows 服务使用的简单值更复杂的请求。您的代码也将是跨平台的
-
所以我得到了所有这些(
BackgroundService根本与 Windows 服务无关)- 但是,我想知道是否有办法捕获发送到 Windows 的命令包含BackgroundService的服务主机。在我看来,如果打算完全支持 Windows 服务,那么应该有一种方法可以通过IHost接口捕获这些内容。Start和Stop命令显然存在钩子,因此似乎必须有一种方法来捕获发送到主机的任何其他服务命令(即使它没有通过“IHost”公开。跨度> -
此外,设置 HTTP 端点显然是新事物的一种选择,但是当使用仅与服务控制器交互的旧系统时,它就成了一个问题。
标签: c# .net .net-core windows-services .net-5