[C#] 服务没有响应控制功能(错误2186)


Answers

如果你想在OnStart调用中做太多工作,通常会发生这种情况。 例如,如果你在同一个线程中启动一个无限循环,你会得到这个错误信息。

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

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

Question

我正在Windows平台上开发一个使用.NET的服务。

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

我也尝试将源恢复到最后的工作版本,但没有其他事情发生: net start outputs:

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

什么可能导致这种故障?

也许大多数人想知道更多关于它的信息。 所以,让我给你看一些代码:

服务代码:

#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

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

更新

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

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

另一个更新

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

又一次更新

受到Rob的评论的刺激,我在事件查看器中看到了这条消息:

> 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例程之前崩溃后无法启动。 卸载该应用程序后,一切照常工作!

谢谢你们!