2010-03-03 48 views
5

我試圖在位於我們在運行時的ServiceHost的App.Config中ConnectionString,以更改數據庫名稱,之後重新啓動它連接到另一個數據庫ConfigurationManager中緩存。這工作正常,但只有當應用程序關閉多秒。關閉幾秒鐘的應用程序似乎清除了ConfigurationManager.Connectionstrings的緩存。問題是,由於這需要關機時間,我不能在我的應用程序中使用Application.Restart()。我怎麼能清除的ConnectionStrings

這個緩存行爲奇怪的是,即使該值在內存(這是要求第二次在本例中)更新的正確顯示更新後的值。但是當應用程序重新啓動時,舊值似乎會重新出現。

要驗證的行爲,創建一個新的控制檯應用程序。

添加App.config文件

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
    <add name="DomainDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=InitialDBName;Integrated Security=SSPI;" /> 
    </connectionStrings> 
</configuration> 

然後將下面的代碼添加到Main方法

 ConfigurationManager.RefreshSection("connectionStrings"); 
     DbConnectionStringBuilder builder = new DbConnectionStringBuilder(); 
     Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     builder.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString; 

     //print initial value 
     Console.WriteLine("initial " + (string)builder["Initial Catalog"]); 

     //change value 
     builder["Initial Catalog"] = "ChangedDatabaseName"; 
     appConfig.ConnectionStrings.ConnectionStrings.Remove("DomainDBConnectionString"); 
     appConfig.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings("DomainDBConnectionString", builder.ConnectionString)); 
     appConfig.ConnectionStrings.SectionInformation.ForceSave = true; 
     appConfig.Save(ConfigurationSaveMode.Full); 
     ConfigurationManager.RefreshSection("connectionStrings"); 

     Console.ReadLine(); 

     DbConnectionStringBuilder builder2 = new DbConnectionStringBuilder(); 
     Configuration appConfig2 = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     builder2.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString; 
     Console.WriteLine("changed " + (string)builder2["Initial Catalog"]); 

     Console.ReadLine(); 

要重現此問題,你需要運行的應用程序(通過按F5)和關閉它。 之後,solutionname.exe.config文件將顯示修改後的值。 如果您第二次運行該應用程序(此時雙擊解鎖名稱.exe,則此時爲),如果您在終止應用程序後立即執行此操作,或等待幾秒鐘後立即執行此操作,您將注意到行爲上的差異。

在我看來,configsection應該重新閱讀,因爲 ConfigurationManager.RefreshSection(「connectionStrings」); 但apparenatelly這不起作用廣告。

+0

給編輯我的標籤的人。這與ASP.Net無關。我的服務器是一個控制檯應用程序。 – 2010-03-03 15:27:05

+1

夠公平的,但它仍然。淨 - 沒有正確標記問題的風險是,其他人會標記它給你,他們會得到錯誤:) – skaffman 2010-03-04 11:42:19

回答

0

這個問題似乎存在於第一次,我從Visual Studio運行應用程序(啓用調試器)。

如果我從運行的bin /調試目錄中的應用程序似乎緩存問題不存在。

對於我的生產環境,這將解決我的問題(因此,換句話說,我的問題是固定的)。然而,這並不能消除我對行爲差異原因的好奇心。

9

兩兩件事:

首先,當你在你不使用solutionname.exe.config調試模式;您實際上使用的是solutionname.vshost.exe.config,這就是爲什麼您的行爲不一致的原因,因爲solutionname.vshost.exe.config文件一旦停止應用程序就會回到原始版本;失去你對它所做的任何改變。

秒這行代碼ConfigurationManager.RefreshSection("connectionStrings"); 並不總是按預期工作。我發現有時候更好地刷新父節或節組;在這種情況下將是「配置」。

所以嘗試ConfigurationManager.RefreshSection("configuration");

+0

ConfigurationManage.RefreshSection(「配置」)沒有幫助我...我解決了這個使用Application.Restart()保存對配置(PS注意,必須從Program.Main()調用Application.Restart(),否則在重啓應用程序將在兩個實例中啓動) – Prokurors 2014-03-27 11:37:23

+0

我已驗證,它不幸是不可能的在「配置」上運行RefreshSection。 – SondreB 2014-08-28 08:25:46