我尝试遵循建议 here用于使用 Microsoft.Extensions.Hosting.WindowsServices
创建 Windows 服务。到目前为止一切顺利,我的后台服务的 ExecuteAsync
被调用,日志显示一切正常。作为控制台应用程序启动应用程序也可以正常工作,我可以启动它,执行我需要执行的任何操作,然后停止它。
但是,我尝试使用以下方法安装 Windows 服务:
sc create myservice binPath= "\"<path-to-the-exe-file>\" service" start= auto DisplayName= "My Service"
我得到[SC] CreateService SUCCESS
。但是当我尝试手动启动该服务时,它告诉我它没有及时响应。再次,日志很好,没有错误。事件查看器没有告诉我任何可能出错的信息,而且我不知道下一步该怎么做才能找到问题的原因。
这是我用来配置主机的大致代码:
var containerBuilder = new ContainerBuilder();
IContainer container = null;
var hostBuilder = Host.CreateDefaultBuilder(appArgs);
hostBuilder
.UseServiceProviderFactory(new CustomAutofacServiceProviderFactory(() => container))
.ConfigureServices(services =>
{
services.AddHostedService<BackgroundWorker>();
containerBuilder.Populate(services);
container = containerBuilder.Build();
})
.UseWindowsService();
这是我用于后台服务的类。
public class BackgroundWorker : BackgroundService
{
private readonly IAppContext appContext;
private CancellationTokenRegistration stopRegistration;
public BackgroundWorker(ILogger<BackgroundWorker> logger, IAppContext appContext)
{
this.Logger = logger;
this.appContext = appContext;
}
public ILogger<BackgroundWorker> Logger { get; }
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
this.Logger.Info("Background worker started.");
this.stopRegistration = stoppingToken.Register(() =>
{
this.Logger.Info("Background worker stopping...");
this.stopRegistration.Dispose();
this.Logger.Info("Background worker stopped.");
});
return Task.CompletedTask;
}
}
最佳答案
经过几个小时的努力,我现在找到了答案。
我使用 Autofac 作为依赖注入(inject)容器,并在 HostBuilder.ConfigureServices()
中使用我正在构建 Autofac 容器。
之后我调用.UseWindowsService()
,但为时已晚,因为 Autofac 已经完成了容器的构建。
所以,答案是,使用 .UseWindowsService()
在容器构建之前,否则对组合的服务没有影响。
以下是更改后的代码:
var containerBuilder = new ContainerBuilder();
IContainer container = null;
var hostBuilder = Host.CreateDefaultBuilder(appArgs);
hostBuilder
.UseServiceProviderFactory(new CustomAutofacServiceProviderFactory(() => container))
.ConfigureServices(services =>
{
services.AddHostedService<BackgroundWorker>();
})
.UseWindowsService() //<-- Done BEFORE building container
.ConfigureServices(services =>
{
containerBuilder.Populate(services);
container = containerBuilder.Build();
})
关于.net - 使用 Microsoft.Extensions.Hosting.WindowsServices 时无法启动 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58750612/