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:
- 在单独的线程上调用提取和转换方法
- 异步调用提取和转换方法
- 使用计时器启动提取和转换过程
如果您(像我一样)正在努力启动服务 - 到目前为止您所发现的只是在单独的线程中开始工作的参考(您已经这样做了)这可能就是解决方案..
我的问题是我有一个外部 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.
所以我更改了程序以在其自己的服务器内部引用所有内容,并且运行良好。
作为第一步,我创建了 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:
- 在单独的线程上调用提取和转换方法
- 异步调用提取和转换方法
- 使用计时器启动提取和转换过程
如果您(像我一样)正在努力启动服务 - 到目前为止您所发现的只是在单独的线程中开始工作的参考(您已经这样做了)这可能就是解决方案..
我的问题是我有一个外部 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.
所以我更改了程序以在其自己的服务器内部引用所有内容,并且运行良好。