【发布时间】:2018-10-29 15:40:26
【问题描述】:
我在 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 秒后超时,没有任何明显的启动服务尝试。从程序 main 启动服务线程确实可以正常工作。
使用WorkerService.exe 启动服务按预期工作,使用WorkerService.exe start(启动服务)启动它不起作用。
由于 Topshelf 3 和 4 会发生这种情况,这很可能是我在应用程序中做错了什么。非常感谢任何指向正确方向的指针。
【问题讨论】:
-
看起来 WorkerService 内部出了点问题。这不是你的 ServiceControl 实现吗?
-
它甚至没有那么远,Topshelf 甚至没有调用
ConstructUsinglambda(所以没有控制台日志),而只是作为服务,而不是独立的 -
控制台日志?您不是通过 topshelf 命令将其安装为 Windows 服务吗,就像这里所说的那样:docs.topshelf-project.com/en/latest/overview/… ?