我有一个开始拒绝启动的.Net服务 - 系统日志显示它“已成功发送启动控件”,然后五秒钟后“服务进入停止状态”。我的服务类的Main()函数包含在try / catch块中 - 但是当出现这种情况时,我的服务日志中没有出现任何错误。
我想知道问题是什么。如果有一些未被捕获的异常 - 它会被捕获到哪里?下面是我运行服务的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
namespace MyServerService
{
static class service
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
try
{
#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()
};
ServiceBase.Run(ServicesToRun);
} catch (Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("MyServerService", "Main() Error: " + ex.Message + ex.InnerException, System.Diagnostics.EventLogEntryType.Error);
}
}
}
}
答案 0 :(得分:1)
Run方法不会抛出这里。相反,您需要将代码包装在try / catch块中MyService类的OnStart方法的重载中,因为这是发生异常的地方。
答案 1 :(得分:1)
您的ServiceBase.OnStart实施有何作用?如果在一段设定的时间内没有返回,则服务控制管理器将再次停止服务。理想情况下,您应该在OnStart方法中创建一个新线程以进行任何所需的处理并尽快返回。
答案 2 :(得分:1)
在这种情况下,我正在编写Windows应用程序日志 - 在生产环境中,日志已满。我不确定调试技术应该是什么来“捕获”这类问题 - 但这对我们来说是个问题。
答案 3 :(得分:0)
我会检查服务所依赖的所有组件是否正确安装。
使用ildasm.exe或同等工具检查它需要的内容并查看它是否可用。
答案 4 :(得分:0)
您可以向AppDomain.Current.UnhandledException添加处理程序,并将一些日志记录代码放入异常处理程序中。这将允许您捕获导致服务停止的任何异常。
在VB.NET中,它看起来像这样
Sub Main(ByVal ParamArray parameters As String())
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AppDomainExceptionHandler
...
End Sub
Private Sub AppDomainExceptionHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
...
End Sub
不确定它在C#中会是什么样子,因为我的C#-fu不是很好