C# Topshelf 超时异常

C# Topshelf TimeoutException

作为第一步,我创建了 Windows 服务项目并对其进行了正确配置

在第二步,我在我的项目中添加了 TopShelf 版本 3.1.135.0 如果我 运行 我的服务通过 (F5 运行 ) 然后它正在加载 Top-shelf 控制台和服务已成功完成。

但是,当我运行安装它并从命令提示符启动它时,我遇到以下超时错误。

Topshelf.Hosts.StartHost Error: 0 : The service failed to start., System.Service
Process.TimeoutException: Time out has expired and the operation has not been co
mpleted.



 public class AppService
    {
        LoggingService loggingService = new LoggingService(typeof(AppService).Name);


        public void Start()
        {
            loggingService.Info("SampleService is Started");
            ExtractProcess.Start();
            TransformProcess.Start();

        }

        public void Stop()
        {
            loggingService.Info("SampleService is Stopped");

        }
    }

-- 更新代码以修复此问题

 public void Start()
    {
        loggingService.Info("MPS.GOA.ETLService  is Started");
        ThreadStart myThreadDelegate = new ThreadStart(StartService);
        Thread myThread = new Thread(myThreadDelegate);
        myThread.Start();

    }

private void StartService()
{
    timer.Elapsed += new System.Timers.ElapsedEventHandler(OnElapsedTime);
    timer.Interval = 60000 * ServiceIntervalInMinutes;     //1 minute 60000 milliseconds
    timer.Enabled = true;
    Process();
}

private void Process()
{
    ExtractProcess.Start();
    TransformProcess.Start();
}

有什么建议吗?

发生此错误是因为您运行服务的启动方法中的提取和处理方法。这在 Visual Studio 中是可以的,但是当您安装服务并启动它时,服务控制管理器等待 Start 方法到 return,如果它在一定时间内(30 秒)没有这样做默认情况下)那么它将 return 这个错误。

您有几个选项,所有选项都将允许 Start 方法立即return:

  1. 在单独的线程上调用提取和转换方法
  2. 异步调用提取和转换方法
  3. 使用计时器启动提取和转换过程

如果您(像我一样)正在努力启动服务 - 到目前为止您所发现的只是在单独的线程中开始工作的参考(您已经这样做了)这可能就是解决方案..

我的问题是我有一个外部 JSON 配置文件正在从项目的目录路径中读取。我需要的是获取程序集路径,以便在使用 Topshelf 发布和安装 .NET 应用程序时 - 它会在正确的位置查找配置文件。

string assemblyPath = Path.GetDirectoryName(typeof(MyConfigManagerClass).Assembly.Location);

var builder = new ConfigurationBuilder()
    .SetBasePath(assemblyPath)
    .AddJsonFile("config.json", optional: false);

myConfigurationObject = builder.Build();

topshelf报错说服务无法启动,现在终于知道原因了

就我而言,解决问题的不是上述解决方案,而是 topshelf 服务中的实际权限,需要访问驻留在外部服务器中的文件。

TopShelf program running on test server

Log file located on Production server

Test server does not have access to external servers, for security reasons.

所以我更改了程序以在其自己的服务器内部引用所有内容,并且运行良好。