2013-10-01 61 views
2

我創建了一個Windows服務,用於執行多個週期性操作(如備份,健全性檢查,報告生成等)的自動化過程(.Net代碼)。構建項目後,我用installutil安裝服務。一切都很好。Windows服務無法讀取來自App.config的參數

我決定在App.config文件中爲這些自動過程移動各種「靜態」參數。我用installutil /u卸載了以前版本的服務,並構建了該項目的新版本。在我的構建輸出文件夾中,有一個AppName.exe文件和一個AppName.exe.config文件,正如我所期望的那樣。我以管理員身份從VS 2012開發人員命令提示符中安裝了installutil的新版服務。

問題是服務似乎無法從ConfigurationManager讀取配置文件。 ConfigurationManager.AppSettings("paramname")的調用不會失敗,但生成的參數值是空字符串。據我所知,問題出現在所有參數上,而不僅僅是特定的參數。參數位於<appSettings>部分,位於<configuration>下,就像我之前在多個項目中做過多次一樣。

我不知道它是否可以幫助,但我的服務運行在LocalSystem帳戶上,並在安裝後和Windows自動啓動。

我做錯了什麼?

編輯:我已經嘗試卸載/重新安裝服務(多次),就像一些stackoverflow答案建議。另外,我不想在運行時更新/刷新文件。

+1

根據您對服務進行編碼的方式,您可能需要重新啓動服務才能獲取app.config中的任何更改。 例如,如果它在OnStart期間讀取配置節並將它們存儲在變量中,那麼除非您重新啓動服務,否則它將不會接受更改。所以問題是:你在哪裏調用'ConfigurationManager'?我甚至在一個exe文件中看到過你有多個服務的情況,並且在所有這些服務都重新啓動之前,它並不一定會收到更改。 – NotMe

+0

我在每個自動化過程(在OnStart期間調用它)的構造函數中都調用了'ConfigurationManager',但我沒有在運行時做任何更改,所以我認爲它不應該成爲問題。另外,我的項目中只有一個服務和一個安裝程序。 –

+1

有趣的是,它沒有失敗,但沒有得到價值。你能發佈加載應用程序設置的實際代碼和配置文件的副本嗎? – NotMe

回答

0

原來我正在獲取一個變量的配置值,這個變量的聲明與我用來存儲該值的屬性名稱相同。由於不明原因,我沒有編譯器的警告。由於無法調試Windows服務,因此解決方案是查看代碼/從頭重寫此部分,這就是我看到錯誤時的情況。

+2

爲了調試Windows服務,請參閱: http://www.codeproject.com/Articles/10153/Debugging-Windows-Services-under-Visual-Studio-NET 和下面的討論。 –

2

我通過在運行時設置配置文件的位置解決了這個問題。這使我能夠在任何我想要的地方放置和命名配置文件。我獲取正在執行的程序集路徑,然後檢查配置文件是否存在。 Check the answer on this thread how to dynamically set the config file

這是我如何獲取執行的程序集:

var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
var configFilePath = Path.Combine(path, "service.config"); 

希望這有助於!