.NET Core / .NET 5 中 BackgroundService 中 ServiceBase.OnCustomCommand 的等价物
Equivalent of ServiceBase.OnCustomCommand in BackgroundService in .NET Core / .NET 5
我使用 BackgroundService
worker 在 .NET Core(也在 .NET 5)中创建了一个 Windows 服务,运行 它作为一个 Windows 服务使用IHostBuilder.UseWindowsService()
电话。
我的问题是,如何捕获 Windows 服务命令,例如
sc.exe control <my service name> 200
据我所知,在这种构建 Windows 服务的新方式中,我无法捕捉到与旧 ServiceBase.OnCustomCommand
相当的东西。
如能提供有关如何捕获这些命令的任何帮助,我们将不胜感激。即使答案只是 “返回为您的 Windows 服务使用 ServiceBase”。
谢谢!
对于仍在寻找答案的任何人。请参阅 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;
}
}
我使用 BackgroundService
worker 在 .NET Core(也在 .NET 5)中创建了一个 Windows 服务,运行 它作为一个 Windows 服务使用IHostBuilder.UseWindowsService()
电话。
我的问题是,如何捕获 Windows 服务命令,例如
sc.exe control <my service name> 200
据我所知,在这种构建 Windows 服务的新方式中,我无法捕捉到与旧 ServiceBase.OnCustomCommand
相当的东西。
如能提供有关如何捕获这些命令的任何帮助,我们将不胜感激。即使答案只是 “返回为您的 Windows 服务使用 ServiceBase”。
谢谢!
对于仍在寻找答案的任何人。请参阅 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;
}
}