繁体   English   中英

C# Topshelf 超时异常

[英]C# Topshelf TimeoutException

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

在第二步中,我在我的项目中添加了TopShelf版本 3.1.135.0如果我通过 (F5 Run) 运行我的服务,那么它正在加载 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();
}

有什么建议?超时错误

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

您有几个选项,所有这些选项都允许Start方法立即返回:

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

如果你(像我一样)正在努力让服务开始 - 你到目前为止所发现的只是引用在一个单独的线程中开始工作(你已经做过), 这可能就是这里的解决方案 ..

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

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 程序

位于生产服务器上的日志文件

出于安全原因,测试服务器无权访问外部服务器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM