.net - 使用 Microsoft.Extensions.Hosting.WindowsServices 时无法启动 Windows 服务

标签 .net windows-services background-service .net-core-3.0

我尝试遵循建议 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/

相关文章:

mysql - 错误 2003(HY000) 无法连接到 'localhost' (10061) 上的 MySQL 服务器

c# - 服务安装程序类可以在不同的程序集中运行吗?

java - 操作系统启动时启动后台服务

android - 使用 Work Manager API 每秒执行一次任务

c# - 无法定义静态抽象字符串属性

c# - Gridview点击表头排序触发行命令

c# - 监听 8080 端口的 WebSocket Windows 服务

c# - 如何按需运行后台服务 - 而不是在应用程序启动或计时器上

asp.net - .NET WebAPI 在本地主机上运行良好,但在 Azure 上不起作用

c# - 任务并行库 (TPL) 是否处理竞争条件