如何检测直接停止状态而没有错误的.net服务的问题

时间:2009-01-21 17:10:39

标签: .net windows-services

我有一个开始拒绝启动的.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);
            }
        }
    }
}

5 个答案:

答案 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不是很好