Topshelf 不调用服务启动

Topshelf does not call service start

我在 Topshelf 中看到不同的行为,这取决于我是在独立模式下启动应用程序还是作为服务安装。我试过 Topshelf 3.3.1 和 4.1。

我正在使用实现 ServiceControl 的服务,它在独立模式下运行良好。尝试启动已安装的服务时,我收到消息说该服务响应控制请求的时间太长。

var resultCode = HostFactory.Run(x =>
{
    x.Service<ServiceControl>(sc =>
    {
        sc.ConstructUsing(() =>
        {
            Console.WriteLine("GET INSTANCE!");
            return new WorkerService();
        });
        sc.WhenStarted((s, h) =>
        {
            Console.WriteLine("START!");
            return s.Start(h);
        });
        sc.WhenStopped((s, h) =>
        {
            Console.WriteLine("STOP!");
            return s.Stop(h);
        });
        sc.BeforeStartingService(() => Console.WriteLine("BEFORE START!"));
    });

    x.SetDescription("WorkerService");
    x.SetDisplayName("WorkerService");
    x.SetServiceName("WorkerService");
});

这是调用服务的非常冗长的版本(有很多控制台输出),但即使调用 ConstructUsingBeforeStartingService不产生任何控制台输出,而 Service<> lambda 中的日志调用产生输出。

我在这里一无所知,但也无法用最少的样本重现这一点。超时在大约 3-4 秒后出现,没有任何可见的服务启动尝试。从程序 main 启动服务线程确实可以正常工作。

使用 WorkerService.exe 启动服务按预期工作,使用 WorkerService.exe start 启动服务(启动服务)不起作用。

由于 Topshelf 3 和 4 会发生这种情况,这很可能是我在应用程序内部做错了什么。非常感谢任何指向正确方向的指示。

你有没有把WorkerService注册为ServiceControl?如果没有,请注册该服务。 (您使用 Autofac 吗?)。 如果没有,请尝试提供

x.Service<WorkerService>(sc => // Your code

而不是服务控制

我现在有一个领先优势:作为加载配置的一部分,我们正在从漫游 AppData 加载一个文件,看起来如果该文件不可访问,则会抛出异常并静默丢弃。如果该文件不存在,服务将按预期启动并且一切正常。

所以基本问题是在启动Topshelf服务配置部分之前抛出了一个未捕获的异常,这似乎是用来在调用带启动参数的exe时将一些输出转发到命令行应用程序。

我会在时间允许的情况下尝试对此进行调查,并利用所学知识为 Topshelf 做出贡献。

尝试在cmd中注册服务(使用管理员权限):

安装:yourApplication.exe install
卸载:yourApplication.exe uninstall