2011-04-10 39 views
7

我正在.NET 4.0中創建一個Windows服務,並通過引用服務項目來測試窗體客戶機的某些功能。如何使用configurationManager從.Net 4.0的App.config中讀取值?

服務項目有一個App.config文件和文件看起來像這樣:

<?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
    <connectionStrings> 
     <clear /> 
     <add name="myLocalMySQLDBUsername" connectionString="username"/> 
    </connectionStrings> 
    </configuration> 

當屬於該服務的函數調用:

  • ConfigurationManager.ConnectionStrings( 「myLocalMySQLDBUsername」) .ConnectionString

由於我的連接字符串未加載,所以引發空引用錯誤。加載的唯一connectionStrings來自位於c:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config中的machine.config文件

如果我爲服務創建應用程序作用域設置,我可以通過使用My.Settings.setting - >來獲得該設置,所以它不像App.config文件沒有被讀取。

我的問題是:爲什麼我的connectionStrings沒有從App.config文件加載?

謝謝你的幫助。

UPDATE:

而且,在這一點上,甚至周圍的工作,將不勝感激;使用app.config的唯一原因是能夠使用DpapiProtectedConfigurationProvider加密內容(內容將具有用於服務和數據庫連接的一些用戶名/密碼值)。

我試着在app.config中手動創建一個AppSettings部分,但這些設置也沒有被配置管理器(count = 0)讀取。

更新2:

每一個建議,我試圖手動打開app.config文件像這樣:

Dim exePath As String = System.IO.Path.Combine(Environment.CurrentDirectory, "ServiceName.exe") 

Dim myConfig As Configuration = ConfigurationManager.OpenExeConfiguration(exePath) 

因此,這裏是怪異的一部分,當我進去看看,路徑是正確的(指向我的app.config),但connectionStrings仍然從machine.config文件加載(我的connectionStrings不加載)!哎呀

更新3:

好了,所以,我想它了。從另一個項目(子項)引用項目(父項)時,即使正在使用父項的類,也會使用子項的app.config。因此,如果我將它們複製到孩子的app.config中,我可以獲取connectionStrings。當試圖手動打開它的時候,我的currentDirectory是孩子的,而不是父母(奇怪的是它沒有拋出異常 - 它不能找到配置文件......它只是默默地使用machine.config ... 好吧)。

謝謝大家的幫助!

+0

可能是一個愚蠢的問題,但你如何部署服務和它的app.config?你在正確的目錄下有servicename.exe.config嗎? – 2011-04-10 01:13:34

+0

我還沒有部署它......所有仍在我的本地機器上進行調試。當我部署它時,我將確定配置文件在System32文件夾(我認爲)或Windows服務默認查找文件的任何文件夾中結束。 – Dima 2011-04-10 01:24:44

+0

變通後發佈。 – Hogan 2011-04-10 02:21:25

回答

5

您要做的第一件事是確保服務帳戶有權訪問該文件(如果不作爲SYSTEM運行)。這聽起來像應該沒問題,但自從你提到My.Settings.Setting的作品。

要注意的另一件事是確保app.config中有服務可執行文件的名稱 - 所以如果服務exe文件是MyService.exe,則app.config必須命名爲MyService.exe。配置。

最後需要注意的是:庫將從加載庫的可執行文件的app.config中讀取,而不是與庫中的app.config一起讀取。因此,如果您有服務可執行文件MyService的項目和庫的項目MyServiceLibrary,那麼庫中的代碼將從MyService而不是MyServiceLibrary讀取app.config。

+0

所有帳戶都可以。正確命名(我的意思是,它在編譯時是自動命名的,並且在調試文件夾中驗證了該名稱是正確的)。我想過要使用哪個App.config,並得出與您概述的相同的結論 - 即服務app.config是使用的那個。我仍然爲了我的connectionStrings不被讀取而在牆上跳動......嘆息 – Dima 2011-04-10 01:22:55

+0

我想我最初誤解了你的評論/回答,但你是對的。謝謝。 – Dima 2011-04-10 04:19:13

+0

這是最接近真正的答案,但我在我的問題中評論,使其更清晰(我想,我希望)。 – Dima 2011-04-10 04:26:59

0

確保配置文件與可執行文件部署到相同的文件夾,並且它的名稱爲your.assembly.exe.config

+0

正如我所提到的,如果我創建了一個設置,那麼這個設置就可以沒有問題地檢索出來。 – Dima 2011-04-10 01:18:40

+0

@Dima:用戶設置不存儲在app.config – 2011-04-10 01:43:26

+0

應用程序設置;對不起,如果不明確。 – Dima 2011-04-10 01:45:45

2

我看到有些人說這個問題可能是由手動加至System.Configuration.dll

邊注參考固定:如果這真的是你整個app.config文件,而不只是一個片段,然後是你的問題...你是app.config文件應該更復雜或者.NET將無法加載它。

工作環境:使用配置管理器打開這個配置文件(這裏有一個API)。你不能讓它自動加載,只是告訴配置管理器打開它。

我仍然認爲問題是你的配置文件無效 - 你可以請發佈完整的文件嗎?

+0

你是什麼意思?所有在配置文件中的內容都是我已經粘貼到問題中的。其實,我很高興你提到這一點,因爲我沒有設置連接字符串的providerName ...這是一個必要的值嗎?如果是這樣,我該如何設置它? – Dima 2011-04-10 02:01:04

+0

http://msdn.microsoft。com/en-us/library/ms254500.aspx – Hogan 2011-04-10 02:06:00

+0

@dima nm關於上一個答案 - 試試上面的評論。 – Hogan 2011-04-10 02:10:04

0

我有類似的問題,但在我的情況下,這是因爲我改變了項目的名稱空間。這也被用作配置文件中的應用程序設置部分元素名稱,所以代碼沒有找到新的部分名稱。擺弄項目屬性中的一個自定義設置的值並重新編譯,導致新節與舊節點一起寫入app.config,這就是向我提出的問題。

相關問題