2013-02-25 70 views
2

我實現了windows服務與eventLogFileSystemWatcher,查找特定目錄中的更改並將消息寫入MyLogwindows服務奇怪的行爲

奇怪的事1:
我通過installUtil.exe安裝(因爲VS2012沒有安裝模板),並在某些情況下,當我去「服務」,並啓動服務,我得到:

本地計算機上的[服務名稱]服務已啓動,然後停止。某些服務如果未被其他服務或程序使用,則會自動停止。

我已經見過this question。 2回答這個帖子爲什麼可以這樣:

1)沒有線程從OnStart()開始。
我使用設計器並在屬性窗口中設置了大部分屬性,並且我從來沒有手動啓動過任何線程,但是在某些情況下一切正常,所以我認爲情況並非如此。

2)OnStart()方法發生異常。我認爲不是這種情況,因爲我不更改代碼。我只是卸載,構建並重新安裝相同的服務,並且在某些情況下運行,有些則不是。

當我被這個東西卡在mabby 2小時的時候,我注意到的Source屬性太長:「FilesMonitoringServices」。我將其更改爲「MonitorSource」,一切開始奏效。比我重新安裝了一次,並得到了與上述相同的警告。我再次更改了Source屬性,現在該服務正在運行。
這是第一件奇怪的事情。

奇怪的事情2:更糟。即使它運行它只記錄OnStart()OnStop()方法,我的意思是fileSystemWatcher事件處理程序永遠不會行爲。這很奇怪,因爲今天我重新安裝了這個服務mabby百倍和它正在工作的3倍,但是在我再次重新安裝它之後,它停止了。而且我根本沒有改變重新安裝之間的代碼。

這裏是我的課(MonitoringService)繼承ServiceBase的方法和構造:

public MonitoringService() 
    { 
     InitializeComponent(); 

     if (!EventLog.SourceExists(eventLog.Source)) 
     { 
      EventLog.CreateEventSource(eventLog.Source, eventLog.Log); 
     } 
     // haven't changed it between the reinstallations 
     fileWatcher.Path = @"path";     
    } 

protected override void OnStart(string[] args) 
    { 
     fileWatcher.EnableRaisingEvents = true; 
     eventLog.WriteEntry("start", EventLogEntryType.Information); 
     base.OnStart(args); 
    } 

    protected override void OnStop() 
    { 
     fileWatcher.EnableRaisingEvents = false; 
     fileWatcher.Dispose(); 
     eventLog.WriteEntry("stop", EventLogEntryType.Information); 
     base.OnStop(); 
    } 

和文件系統觀察事件處理程序:

private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e) 
    { 
     using (var conn = new SqlConnection(GetConnectionString())) 
     { 
      conn.Open(); 
      var productId = Convert.ToInt32(Regex.Match(e.Name, @"\d+").Value); 
      const string cmd = "UPDATE Products SET [email protected] WHERE [email protected]"; 
      using (var command = new SqlCommand(cmd, conn)) 
      { 
       command.Parameters.AddWithValue("@productId", productId); 
       command.Parameters.AddWithValue("@date", DateTime.Now); 
       command.ExecuteNonQuery(); 
      }     
     } 
     eventLog.WriteEntry(string.Format("{0} has been changed: {1}", e.Name, DateTime.Now), EventLogEntryType.Information);    
    } 

問:在我看來那此行爲不是由我的代碼而是由操作系統設置引起的。它可以這樣嗎?

****編輯:剛剛發現更多具體的東西:**

1)如果顯示消息(當我要啓動服務):

The [service name] service on local computer started and then stopped. .... 

我需要改變SourceeventLog的財產,重建和重新安裝。這個消息不會出現;下一次馬布比。

2)我有以下文件夾層次結構:images/prod-imagesimagesprod-images目錄都包含圖像文件。當服務運行時,我從prod-images文件夾中更改圖像,將消息按要求寫入日誌,並更新數據庫。但是在這個事件發生之後,服務停止! (我檢查了這3次)。當我重新啓動,並再次重複這幾次它更新數據庫,寫日誌,在3D時代,我得到

The [service name] service on local computer started and then stopped. .... 

但是,這不是最好的部分),如果我改變是images圖像目錄我可以多次執行,服務不會停止。 (只有來自images/prod-images的圖像綁定到數據庫中的條目)。

那麼,mabbe這個功能莫名其妙地反駁數據庫訪問?

編輯2:在visual studio中我使用DEBUG -> Attach to Process來調試服務。我設置了斷點並更改圖像。第一次事件處理程序完美地執行:數據庫被更新並寫入日誌消息。但是,比我繼續按F11(Step Into)並且這個事件處理程序第二次執行。在生產線

var productId = Convert.ToInt32(Regex.Match(e.Name, @"\d+").Value); 

我得到 「FormatException是未處理」。在此之後,我停止調試並停止服務!就是這樣:事件處理程序中發生異常。

你知道它爲什麼執行第二次?謝謝!

P.S.我已經提交了DavutGürbüz的答案,因爲他指出了我正確的方向。
無論如何,請查看我自己的解答實際問題的答案。

+0

這是一個錯字? '事件日誌。EnableRaisingEvents = TRUE;',而不是'fileWatcher.EnableRaisingEvents = TRUE;' – 2013-02-25 16:56:19

+0

是的,這是一個錯字,對不起 – 2013-02-25 16:59:17

回答

2

如果你有啓停錯誤,這意味着你在構造函數中有錯誤。

嘗試抓住你的ctor。您可以將錯誤記錄到catch塊中的eventlog。

除此之外,我創建了一個主要方法,並以控制檯應用程序啓動win服務。如果我在主方法中獲得服務實例,我也可以調試它。

//You should select Console Application from Application properties 
static void Main(string[] args) 
    { 
     MyWindowsService service = new MyWindowsService(); 

     if (Environment.UserInteractive) 
     { 
      service.OnStart(args); 
      Console.WriteLine("Press any key to stop program"); 
      Console.Read(); 
      service.OnStop(); 
     } 
     else 
     { 
      ServiceBase.Run(service); 
     } 

    } 

希望幫助

+0

現在我沒有得到啓動 - 停止錯誤。該服務在更改映像後立即停止(並且日誌中沒有條目,並且數據庫未更新)。我嘗試在ctor,OnStart和OnStop方法中添加try/catch塊並將異常記錄到MyLog中 - 不起作用。服務和以前一樣停止。 – 2013-02-25 20:29:48

+0

因此,只要做我的第二個選擇,使用win服務作爲控制檯應用程序,在主要方法創建服務和console.readkey不退出主。通過這種方式,您可以運行您的雙贏服務作爲控制檯應用程序。然後測試它出了什麼問題。 – 2013-02-26 04:27:29

+0

Windows事件日誌中是否有錯誤?即使他們通常不會顯示確切的原因,所以只需將其作爲控制檯應用程序啓動即可。也許你丟棄了一個對象並嘗試訪問,錯過了一個定時器開始,......很多事情都會導致 – 2013-02-26 04:38:51

0

爲什麼fileSystemWatcher1_Changed事件處理方法,兩次執行的原因是因爲我是監測images文件夾中包含的子目錄中。此事件處理程序正在監視所有LastWrite事件。

因此,當我更改images/prod-images目錄中的圖像時,此處理程序對圖像更改以及文件夾更改作出了反應。

在這種情況下,我可以將監視路徑更改爲prod-images或在更新數據庫時插入if語句。

這樣一個愚蠢的錯誤,我花了幾天的時間找到它))