该服务没有响应控制功能(错误2186)

问题描述:

我正在Windows平台上使用.NET开发服务。该服务没有响应控制功能(错误2186)

它一直工作到昨天...但今天它不想开始!这似乎很奇怪,我觉得我失去了一些东西......

我也试着恢复源到最后一个工作版本,但没有什么事情发生:网开始输出:

该服务没有响应控制功能。

什么可能导致此故障?


也许你们大多数人想知道更多关于它的信息。那么,让我告诉你一些代码:

的服务代码:

#if DEBUG 
class iGeckoService : DebuggableService 
#else 
class iGeckoService : ServiceBase 
#endif 
{ 
    static void Main() 
    { 
#if DEBUG 
     if (Debugger.IsAttached == true) { 
      DebuggableService[] services = Services; 

      // Create console 
      AllocConsole(); 

      // Emulate ServiceBase.Run 
      foreach (DebuggableService service in services) 
       service.Start(null); 

      // Wait for new line 
      Console.WriteLine("Press ENTER to exit..."); Console.ReadLine(); 

      // Emulate ServiceBase.Run 
      foreach (DebuggableService service in services) 
       service.Stop(); 
     } else 
      ServiceBase.Run(Services); 
#else 
     ServiceBase.Run(Services); 
#endif 
    } 

#if DEBUG 

    static DebuggableService[] Services 
    { 
     get { 
      return (new DebuggableService[] { new iGeckoService() }); 
     } 
    } 

    [DllImport("kernel32")] 
    static extern bool AllocConsole(); 

#else 

    static DebuggableService[] Services 
    { 
     get { 
      return (new ServiceBase[] { new iGeckoService() }); 
     } 
    } 

#endif 

    #endregion 

    #region Constructors 

    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public iGeckoService() 
    { 
     // Base properties 
     ServiceName = DefaultServiceName; 

     // Service feature - Power events 
    } 

    #endregion 

    protected override void OnStart(string[] args) 
    { 
     try { 
      ... 

     } catch (Exception e) { 
      sLog.Error("Unable to initialize the service. Request to stop.", e); 
     } 
    } 

    /// <summary> 
    /// Stop this service. 
    /// </summary> 
    protected override void OnStop() 
      { 
        ... 
      } 
    } 

    [RunInstaller(true)] 
public class iGeckoDaemonInstaller : Installer 
{ 
    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public iGeckoDaemonInstaller() 
    { 
     ServiceProcessInstaller spi = new ServiceProcessInstaller(); 
     spi.Account = ServiceAccount.LocalSystem; 

     ServiceInstaller si = new ServiceInstaller(); 
     si.ServiceName = iGeckoService.DefaultServiceName; 
     si.StartType = ServiceStartMode.Automatic; 

     Installers.AddRange(new Installer[] {spi, si}); 
    } 
} 

class DebuggableService : ServiceBase 
{ 
    public void Start(string[] args) { OnStart(args); } 
} 

启动脚本是:

installutil ..\bin\Debug\iGeckoService.exe 
net start "Gecko Videowall" 

而停止脚本是:

net stop "Gecko Videowall" 
installutil /u ..\bin\Debug\iGeckoService.exe 

但是,我认为这是一个系统设置,因为t他的应用程序运行良好,直到最后一天。 (叹)。


更新

当服务是工作,我用log4net的日志记录服务活动(我无法调试器附加到正在运行的服务......),并且它一直记录。

从现在开始,即使我登录Main例程,也不会创建log4net日志(即使启用了内部调试选项)!


另一个更新

似乎永远不会执行应用程序。我减少了每个例程(Main,OnStart,OnStop),并运行一个空服务。 OnStart例程在目录上创建一个文件(每个人都可写),但是当服务启动时,不会创建任何文件。


另一个更新

由罗布的评论的刺激下,我看到在事件查看器此消息:

> Faulting application name: iGeckoService.exe, version: 1.0.0.0, time stamp: 0x4c60de6a 
> Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b 
> Exception code: 0x80000003 
> Fault offset: 0x000000000004f190 
> Faulting process id: 0x1258 
> Faulting application start time: 0x01cb384a726c7167 
> Faulting application path: C:\Users\Luca\Documents\Projects\iGeckoSvn\iGeckoService\bin\Debug\iGeckoService.exe 
> Faulting module path: C:\Windows\SYSTEM32\ntdll.dll 
> Report Id: b096a237-a43d-11df-afc4-001e8c414537 

这是,明确,在对服务的原因关机...没有问题变成:“如何调试?”(谢谢罗布,我从来没有想过事件查看器,直到现在!) 调试它作为控制台应用程序运行时,它不显示任何错误,的确它看起来与服务环境有关。唯一出现在我脑海的可能是一些DLL加载失败,因为现在服务是空的......任何想法?

(谢谢大家跟着我......我想向您提供比萨饼&啤酒)


解决了!

服务在安装和设置MS应用程序验证程序(x64)后,无法在Main例程之前崩溃后启动。卸载该应用程序后,一切照常工作!

谢谢大家!

+0

在您尝试执行服务时,事件日志中是否记录了任何内容? – Rob 2010-08-10 07:28:51

+0

是的。启动时服务崩溃。仍然想知道为什么,因为每个工作版本崩溃的描述。 – Luca 2010-08-10 08:40:43

一般来说每一次服务必须做到以下两个简单的事情

  • 如果服务经理给他一个控制代码像SERVICE_CONTROL_STARTSERVICE_CONTROL_STOP等是否应该返回在很短的时间间隔内。使用SetServiceStatus功能服务可以延长此间隔,例如通过调用SetServiceStatus并增加dwCheckPoint值。 (在.NET中使用可以使用ServiceBase.RequestAdditionalTime代替)
  • 每个服务都必须回答SERVICE_CONTROL_INTERROGATE控制代码。该服务管理器使用该控制代码来检测服务是否仍然存在。

如果您的程序不遵循其中一个规则,您会收到错误“服务没有响应控制功能”。

如果你使用.NET编写程序,则不需要直接执行前面描述的两件事情。 ServiceBase班为你做。尽管如此,如果创建线程的优先级高于正常,或者如果您在OnXXX句柄(OnStop,OnStart,OnPowerEvent等)内部做了一些过长的工作而未调用ServiceBase.RequestAdditionalTime,则可轻松打破此规则。其他线程的一些其他技巧也可能会产生问题。

+0

谢谢你的信息,但它没有帮助。我已经评论了OnStart和OnStop例程(现在它们有空的实现)并且它的行为是相同的。 – Luca 2010-08-10 07:11:26

+0

只需尝试为您的应用程序创建一个新项目,添加.NET安装程序和客栈。按照http://msdn.microsoft.com/en-us/library/zt39148a.aspx中的步骤操作。在新的测试服务成功运行之后,将您的旧代码以小步骤包含在新项目中。这个方法必须工作。 – Oleg 2010-08-10 07:48:41

+0

我同意,我也这么做。我讨厌这种奇怪的行为。 – Luca 2010-08-10 07:51:14

通常会发生这种情况,如果您尝试在OnStart呼叫中做太多工作。例如,如果您在同一个线程中启动无限循环,则会收到此错误消息。

通常服务应该在OnStart调用中创建一个新线程,然后在OnStop调用中干净地终止它。

当然,如果您使用的是之前正在使用的代码,这并没有帮助。您是否尝试过从重新启动失败?我似乎记得,如果您已经获得了一项服务,那么在不重新启动它的情况下回到工作状态有时会非常棘手。你可能想看看你的进程列表,看看你是否有一个副本仍在运行,如果是的话就杀了它。

+0

是的。我尝试重新启动,并且我还评论了例程OnStart和OnStop中的每一行......但它没有奏效。 – Luca 2010-08-10 06:30:10

我看到有一个代码块

// Wait for new line 
      Console.WriteLine("Press ENTER to exit..."); Console.ReadLine(); 

由@乔恩说,因为这是一个服务。当服务启动时,它等待它应该在其中作出响应的规定时间。

有一个声明“Console.ReadLine()”您的服务将等待,直到键被按下。因为这是一个服务将保持在这一点上等待

+0

实际上,只有在使用调试器启动应用程序时才执行该代码。从命令行启动服务时不会发生这种情况。我也试过在没有定义DEBUG预处理器符号的情况下运行应用程序,它具有相同的行为。 – Luca 2010-08-10 06:36:59

+0

你的意思是在你的项目属性中你没有选中define DEBUG常量选项?还可以尝试在发布模式下构建解决方案,然后从发布文件夹进行安装。 – 2010-08-10 06:46:07

+0

是的,我有Release配置没有定义DEBUG预处理器符号。 – Luca 2010-08-10 06:52:47