【问题标题】:Equivalent of ServiceBase.OnCustomCommand in BackgroundService in .NET Core / .NET 5.NET Core / .NET 5 中 BackgroundService 中 ServiceBase.OnCustomCommand 的等效项
【发布时间】: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


【解决方案1】:

对于仍在寻找答案的任何人。请参阅this answer on github 以获得解决方案

基本上是要注册一个自定义的IHostLifetime实现:

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureServices((hostContext, services) =>
    {
        if (WindowsServiceHelpers.IsWindowsService())
            services.AddSingleton<IHostLifetime, CustomService>();
    })

实际实现可能继承自WindowsServiceLifetime,您可以在其中覆盖OnCustomCommand 方法:

/// <summary>
/// Will handle custom service commands
/// </summary>
/// <param name="command">The command message sent to the service.</param>
protected override void OnCustomCommand(int command)
{
    _logger.LogInformation("Received custom service control command: {0}", command);
    switch (command)
    {
        case PreShutdownCommandCode:
            // Handle your custom command code
            break;
        default:
            base.OnCustomCommand(command);
            break;
    }
}

【讨论】:

  • 谢谢。我最终走向了不同的方向,但如果我不得不再次处理这个问题,这将很有用!
猜你喜欢
  • 2019-11-12
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2017-07-23
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
相关资源
最近更新 更多