2009-01-21 53 views
2

我有一个.Net服务,已经开始拒绝启动 - 系统日志显示它“已成功发送一个开始控制”,然后五几秒钟后“服务进入停止状态”。我将服务类的Main()函数包装在try/catch块中 - 但是当出现这种情况时,我的服务中的事件日志中不会显示任何错误。如何检测.net服务的问题,直接停止状态没有错误

我想知道问题出在哪里。如果有一些没有被捕获的异常 - 它会在哪里被捕获?以下是我运行该服务的代码。

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); 
      } 
     } 
    } 
} 

回答

1

在这种情况下,我在写到Windows应用程序日志 - 在生产环境中,日志已满。我不确定调试技术应该如何“捕捉”这类问题 - 但这对我们来说是个问题。

1

Run方法不会抛在这里。相反,您需要将代码包装在try/catch块中MyService类的OnStart方法的重载中,因为这是发生异常的地方。

+0

我打算试试。如果虽然(甚至未被捕获)出现异常,除了服务进入停止状态之外,是否还会得到其他类型的通知? – pc1oad1etter 2009-01-21 20:55:49

+0

如果在启动时出现异常,应将其记录在Windows事件日志中。如果它简单地超时,你会得到什么,但。 – 2009-01-21 20:58:19

1

ServiceBase.OnStart实现的功能是什么?如果它在设定的时间内没有返回,则服务控制管理器将再次停止该服务。理想情况下,您应该在您的OnStart方法中创建一个新线程以处理任何所需的内容并尽快返回。

0

我会检查你服务依赖的所有组件是否正确安装。

使用ildasm.exe或等效工具来检查它需要什么并查看它是否可用。

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不是很大