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");
});
这是调用服务的非常冗长的版本(有很多控制台输出),但即使调用 ConstructUsing
或 BeforeStartingService
不产生任何控制台输出,而 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
我在 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?如果没有,请注册该服务。 (您使用 Autofac 吗?)。 如果没有,请尝试提供
x.Service<WorkerService>(sc => // Your code
而不是服务控制
我现在有一个领先优势:作为加载配置的一部分,我们正在从漫游 AppData 加载一个文件,看起来如果该文件不可访问,则会抛出异常并静默丢弃。如果该文件不存在,服务将按预期启动并且一切正常。
所以基本问题是在启动Topshelf服务配置部分之前抛出了一个未捕获的异常,这似乎是用来在调用带启动参数的exe时将一些输出转发到命令行应用程序。
我会在时间允许的情况下尝试对此进行调查,并利用所学知识为 Topshelf 做出贡献。
尝试在cmd中注册服务(使用管理员权限):
安装:yourApplication.exe install
卸载:yourApplication.exe uninstall