[英]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方法立即返回:
如果你(像我一样)正在努力让服务开始 - 你到目前为止所发现的只是引用在一个单独的线程中开始工作(你已经做过), 这可能就是这里的解决方案 ..
我的问题是我从项目的目录路径中读取了一个外部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.