2010-04-05 108 views
18

我想製作一個Windows服務來訪問我的數據庫。我的數據庫是SQL Server 2005.測試Windows服務時出現問題

其實我正在一個網站上工作,我的數據庫在我們的服務器中。我需要每秒訪問我的數據庫並更新記錄。爲此,我需要製作一個Windows服務,它將安裝到我們的服務器並執行任務。

我一直在從我的本地機器訪問數據庫,然後運行服務,但問題是我不知道如何測試此服務。

我試圖安裝到我的本地機器。它安裝,然後我運行該服務,但它沒有執行任務,我認爲服務無法連接數據庫。

服務和安裝程序沒有問題。唯一的問題是如何測試我的Windows服務。

回答

12

您可以將Visual Studio解決方案附加到Windows服務應用程序。然後,您可以像執行普通項目一樣調試Windows服務。

調試 - >附加到進程。

20

您可以隨時創建服務/控制檯應用混合,並使用控制檯應用進行測試。

你需要做的就是這樣的事情 - 在你program.cs,改變Main方法設置爲運行服務,或隨意地運行作爲控制檯應用程序:

static class Program 
{ 
    static void Main(params string[] args) 
    { 
     string firstArgument = string.Empty; 

     if (args.Length > 0) 
     { 
      firstArgument = args[0].ToLowerInvariant(); 
     } 

     if (string.Compare(firstArgument, "-console", true) == 0) 
     { 
      new YourServiceClass().RunConsole(args); 
     } 
     else 
     { 
      ServiceBase[] ServicesToRun = new ServiceBase[] { new YourServiceClass() }; 
      ServiceBase.Run(ServicesToRun); 
     } 
    } 

,然後在你的服務類,如果你想運行的應用程序來測試它的函數的

public void RunConsole(string[] args) 
    { 
     OnStart(args); 

     Console.WriteLine("Service running ... press <ENTER> to stop"); 

     //Console.ReadLine(); 
     while (true) 
     { } 

     OnStop(); 
    } 

現在:從ServiceBase繼承和擁有OnStartOnStop,添加像這樣的RunConsole方法只要用-console命令行參數啓動EXE,並在RunConsole方法中放置一個斷點即可。

+3

+1這應該是公認的答案,因爲這也抓住問題,然後纔能有機會附加到過程。 – Joe 2011-10-26 23:13:55

+1

順便說一句OnStop()無法訪問。 – 2011-11-16 09:56:23

+1

爲什麼Console.ReadLine()註釋掉了?這是不正確的?擺脫無限循環...... – Phil 2012-02-07 20:21:22

2

有幾種方法:

1)創建標準的Windows應用程序調用相同的代碼,這是更容易地運行和調試。這也確保您的服務代碼不在服務範圍內,而是重構到自己的程序集中。

2)在您的服務器程序文件中,檢測服務是否交互運行並調用服務中的服務方法以運行一次。這樣你也可以直接從Visual Studio運行。 (您需要將您的服務方式等公開並創建您的服務立場)

3

使用記錄器報告錯誤!

嘗試抓住每一個可能的錯誤,並將它們記錄在文件中和/或更好地發送電子郵件:記住「沒有人聽到服務死亡」!

Log4Net具有記錄器來處理滾動文件,數據庫持久性,甚至SMTP郵件。例如,請參閱:http://logging.apache.org/log4net/release/config-examples.html 您可能會經常檢查日誌文件是否存在錯誤。爲了避免這種煩擾,我經常使用SMTP appender。

乾杯, B.

2

我想每個人都有提供了很多偉大的答案。這將是我的有序方法來調試此問題:

  • 檢查您的事件日誌。
  • 記錄所有錯誤(Log4Net,企業庫,或只寫入事件日誌),特別是在你的Main方法中有一個try..catch。
  • 編寫一個可以在環境中運行的單元測試。
  • 確保你的app.config文件是正確的。您可能需要將來自不同項目的值合併爲一個。
  • 測試數據庫連接。 Ping服務器。 Telnet到端口1433(如果默認SQL Server)。寫一個簡單的控制檯應用程序來測試
  • 通過附加到進程進行調試。
  • 使用控制檯/服務混合方法(偉大的技術,我用來實時流出調試消息)。
3

marc_s的答案很完美,但是事實上,服務的主線程沒有按照預期等待用戶輸入而暫停。我認爲這就是他爲什麼會陷入無限循環的原因。

Igal Serban's代碼借款創建一個控制檯,這裏的RunConsole()方法的改進,它暫停:

[DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool AllocConsole(); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool FreeConsole(); 

    public void RunConsole(string[] args) 
    { 
     OnStart(args); 

     AllocConsole(); 

     Console.WriteLine("Service running ... press <ENTER> to stop"); 

     Console.ReadLine(); 

     FreeConsole(); 

     OnStop(); 
    } 
+0

謝謝,這一**是**完美! :-) – 2014-02-21 17:13:29