2010-08-10 736 views
7

我正在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

回答

4

一般來說每一次服務必須做到以下兩個簡單的事情

  • 如果服務經理給他一個控制代碼像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

3

通常會發生這種情況,如果您嘗試在OnStart呼叫中做太多工作。例如,如果您在同一個線程中啓動無限循環,則會收到此錯誤消息。

通常服務應該在OnStart調用中創建一個新線程,然後在OnStop調用中乾淨地終止它。

當然,如果您使用的是之前正在使用的代碼,這並沒有幫助。您是否嘗試過從重新啓動失敗?我似乎記得,如果您已經獲得了一項服務,那麼在不重新啓動它的情況下回到工作狀態有時會非常棘手。你可能想看看你的進程列表,看看你是否有一個副本仍在運行,如果是的話就殺了它。

+0

是的。我嘗試重新啓動,並且我還評論了例程OnStart和OnStop中的每一行......但它沒有奏效。 – Luca 2010-08-10 06:30:10

0

我看到有一個代碼塊

// 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

相關問題