c# - Windows 服务 onStart() 未执行
问题描述
我有一个 Windows 服务,在安装它并从服务菜单运行它之后执行 Onstart() 方法时遇到问题。我正在记录执行的每个步骤中发生的所有事情,以查看问题出在哪里。但是没有错误,它在 main 方法中记录并运行良好,直到服务被实际调用运行,然后它什么也不做。
有趣的是,它在调试中运行没有任何问题。
我从中调用服务的程序类(起点):
public class Program
{
private static Container _container;
private static ILogger<Program> _logger;
/// <summary>
/// The main entry point for the application.
/// </summary>
private static void Main()
{
_container = SimpleInjectorContainer.Build(registerConfig: true, useThreadScopedLifestyle: true);
SimpleInjectorContainer.LoggAndVerify(_container);
using (ThreadScopedLifestyle.BeginScope(_container))
{
try
{
_logger = _container.GetInstance<ILogger<Program>>();
_logger.LogInformation("Test - Works");
VerifyConfiguration();
}
catch (Exception ex)
{
var logger = _container.GetInstance<ILogger<Program>>();
logger.LogError(ex, "Configuration is not valid");
throw;
}
if (Environment.UserInteractive)
{
RunDebug();
}
else
{
System.Diagnostics.Debugger.Launch();
_logger.LogInformation("It's Here 49");
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
_container.GetInstance<SenderService>()
};
_logger.LogInformation("It's Here 56");
//up until here its fine, but it doesn't run the next line
ServiceBase.Run(ServicesToRun);
_logger.LogInformation("It's Here 58");
}
}
}
private static void RunDebug()
{
var senderService = _container.GetInstance<SenderService>();
senderService.TestStart();
Console.WriteLine("Sender Started Debug");
Console.ReadLine();
senderService.TestStop();
}
private static void VerifyConfiguration()
{
var configValidator = _container.GetInstance<IConfigurationValidator>();
configValidator.VerifyOperatorPrefixNumbers();
configValidator.VerifyConfiguration();
configValidator.VerifyOperators();
}
}
我的实际服务:
public partial class SenderService : ServiceBase
{
private readonly Container container;
private readonly ILogger<SenderService> logger;
private readonly ISmsHandlerConfig config;
private readonly IConfigurationValidator configValidator;
public SenderService(
Container container,
ILogger<SenderService> logger,
ISmsHandlerConfig config,
IConfigurationValidator configValidator)
{
this.InitializeComponent();
this.container = container;
this.logger = logger;
this.config = config;
this.configValidator = configValidator;
}
public void TestStart()
{
Console.WriteLine($"Starting {ServiceName} service");
this.OnStart();
}
public void TestStop()
{
Console.WriteLine($"Stopping {ServiceName} service");
this.OnStop();
}
protected void OnStart()
{
try
{
this.logger.LogInformation($"{this.ServiceName} starting");
SmsHandlerAction();
}
catch (Exception ex)
{
this.logger.LogError(ex, $"Error starting service {this.ServiceName}");
throw;
}
}
protected override void OnStop()
{
try
{
this.Dispose();
this.logger.LogInformation($"{this.ServiceName} stopped");
}
catch (Exception ex)
{
this.logger.LogError(ex, $"Error stopping service {this.ServiceName}");
}
}
private void SmsHandlerAction()
{
while (true)
{
this.logger.LogInformation($"{this.ServiceName} started");
using (ThreadScopedLifestyle.BeginScope(this.container))
{
var smsSenderService = this.container.GetInstance<ISmsSenderService>();
var sendResult = smsSenderService.SendSms(this.container);
// Wait if there are not messages for sending
if (!sendResult && this.config.IdleTimeMiliseconds != 0)
{
Thread.Sleep(this.config.IdleTimeMiliseconds);
}
}
}
}
}
这是记录的内容:
2019-02-12 18:02:18.7972 信息测试 - 作品
2019-02-12 18:02:20.6370 信息在这里 49
2019-02-12 18:02:20.6410 信息在这里 56
在我停止服务之后:
2019-02-12 18:02:35.7375 INFO SenderService 停止
2019-02-12 18:02:35.7375 信息在这里 58
它缺少了this.logger.LogInformation($"{this.ServiceName} starting");
一部分。
它不会在 onstart 方法中记录该行,因为它从未真正执行过,我检查了服务是否正在运行,但只是未能记录,事实并非如此。
我的 IDE 是 VS 2017,操作系统是 Win 7,DI 库是 SimpleInjector 4.0.12。
我知道在 stackoverfllow( this ) 上提出了类似的问题,但我看不出它如何解决我的问题。
我的事件查看器也没有记录任何问题,只有关于它成功启动的信息。
我很迷茫,所以任何指导都会有所帮助。
解决方案
我发现了问题,这是因为我删除了 OnStart() 上的覆盖。
推荐阅读
- haskell - Haskell 列表重复项(如果可能,使用 map、elem 和 foldr)
- reactjs - 调用的突变返回false,但对象是在数据库中创建的
- onenote - OneNote - 无法在 Microsoft 文档中找到所有属性 ID
- swiftui - 如何更改/定义文本位置
- java - 执行查询 CallableStatement 时出现 NullPointerException
- node.js - Mongoose 使用动态地图与使用嵌套文档
- python - 在while循环期间条件改变了,它结束了吗?
- php - URL 设置为 Cookie 值未正确编码
- java - 将列表中的数组添加到Java中的新集合中
- spring - 如何在 Spring 中创建一个 Gradle 任务以仅运行特定的测试