我試圖在位於我們在運行時的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這不起作用廣告。
給編輯我的標籤的人。這與ASP.Net無關。我的服務器是一個控制檯應用程序。 – 2010-03-03 15:27:05
夠公平的,但它仍然。淨 - 沒有正確標記問題的風險是,其他人會標記它給你,他們會得到錯誤:) – skaffman 2010-03-04 11:42:19