根据我是以独立模式启动应用程序还是以服务形式安装应用程序,我在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");
});
这是调用服务的非常的冗长版本(具有大量控制台输出),但是即使对ConstructUsing
或BeforeStartingService
的调用也不会产生任何控制台输出,而Service<>
lambda内部的日志调用会产生输出。
我在这里一无所知,但也无法用最少的样本重现此内容。超时大约在3-4秒后,没有任何明显的尝试启动服务。从程序主启动服务线程确实可以正常工作。
以WorkerService.exe
启动服务可以正常工作,以WorkerService.exe start
(启动服务)启动服务无效。
在Topshelf 3和Topshelf 4中会发生这种情况,很可能是我在应用程序内部做错了。非常感谢任何指向正确方向的指针。
答案 0 :(得分:0)
您是否已将WorkerService注册为ServiceControl?如果没有,请注册服务。 (您是否使用Autofac?)。 如果没有,请尝试提供
x.Service<WorkerService>(sc => // Your code
代替ServiceControl
答案 1 :(得分:0)
我现在处于领先地位:作为加载配置的一部分,我们正在从漫游的AppData中加载文件,并且看起来如果该文件不可访问,则会引发异常并以静默方式将其丢弃。如果该文件不存在,该服务将按预期方式启动,并且一切正常。
因此,基本问题是在启动Topshelf服务配置部分之前引发了未捕获的异常,当使用start参数调用exe时,该异常似乎用于将某些输出转发到命令行应用程序。
在时间允许的情况下,我将尝试进行调查,并通过学习为Topshelf做出贡献。