Topshelf不会致电服务启动

时间:2018-10-29 15:40:26

标签: c# topshelf

根据我是以独立模式启动应用程序还是以服务形式安装应用程序,我在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秒后,没有任何明显的尝试启动服务。从程序主启动服务线程确实可以正常工作。

WorkerService.exe启动服务可以正常工作,以WorkerService.exe start(启动服务)启动服务无效。

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

2 个答案:

答案 0 :(得分:0)

您是否已将WorkerService注册为ServiceControl?如果没有,请注册服务。 (您是否使用Autofac?)。 如果没有,请尝试提供

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

代替ServiceControl

答案 1 :(得分:0)

我现在处于领先地位:作为加载配置的一部分,我们正在从漫游的AppData中加载文件,并且看起来如果该文件不可访问,则会引发异常并以静默方式将其丢弃。如果该文件不存在,该服务将按预期方式启动,并且一切正常。

因此,基本问题是在启动Topshelf服务配置部分之前引发了未捕获的异常,当使用start参数调用exe时,该异常似乎用于将某些输出转发到命令行应用程序。

在时间允许的情况下,我将尝试进行调查,并通过学习为Topshelf做出贡献。