【问题标题】:Topshelf does not call service startTopshelf 不调用服务启动
【发布时间】: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&lt;&gt; lambda 内部产生输出。

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

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

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

【问题讨论】:

  • 看起来 WorkerService 内部出了点问题。这不是你的 ServiceControl 实现吗?
  • 它甚至没有那么远,Topshelf 甚至没有调用ConstructUsing lambda(所以没有控制台日志),而只是作为服务,而不是独立的
  • 控制台日志?您不是通过 topshelf 命令将其安装为 Windows 服务吗,就像这里所说的那样:docs.topshelf-project.com/en/latest/overview/… ?

标签: c# topshelf


【解决方案1】:

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

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

代替ServiceControl

【讨论】:

  • sc.ConstructUsing() 创建服务实例。在独立模式下,这可以正常工作,我只在安装在一台服务器上时才能看到这个
  • 我之前也看到过同样的问题。对我来说,最初的实现主要工作是从一项任务开始的。当我运行 exe 时,一切都按预期工作,但是当我安装 n 作为服务运行它时,我曾经遇到同样的问题。可以发布workerservice代码吗?我认为这与那段代码有关。
【解决方案2】:

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

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

如果时间允许,我将尝试对此进行调查,并将所学知识贡献给 Topshelf。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多