今天在個WCF程序中加入了修改配置文件的功能。我是直接通過IO操作修改的app.config文件內容,修改后發現發現其並不生效,用Google搜了一下,在園子里的文章動態修改App.Config 和web.Config中找到了解決方案。
原來,.net framework中對於配置文件不是實時讀取的,而是有緩存的。對於那些已經更新了的內容,需要調用ConfigurationManager.RefreshSection(需要添加System.Configuration.dll的引用)函數刷新相應節點。
比較蛋疼的是,這個函數並不支持刷新Group。也就是說,我們不能通過ConfigurationManager.RefreshSection("system.serviceModel")一句話實現對WCF的配置刷新,需要調用如下四句話才行。
ConfigurationManager.RefreshSection("system.serviceModel/behaviors");
ConfigurationManager.RefreshSection("system.serviceModel/bindings");
ConfigurationManager.RefreshSection("system.serviceModel/client");
ConfigurationManager.RefreshSection("system.serviceModel/services");
另外,值得一提的是:如果用IO操作修改修改app.config配置,直接使用相對路徑"myapp.exe.config"來修改不可靠的,很容易出現找不到配置文件的異常(原因有很多種),需要使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile屬性來獲取配置文件的完整路徑。
我一開始在這兩個網站找到的提示
http://developer.51cto.com/art/200908/146303.htm
http://www.codeproject.com/Articles/14744/Read-Write-App-Config-File-with-NET
結果調試結果不太穩定, 修改了好幾次,代碼如下
1 public class RWConfig 2 { 3 /// <summary> 4 /// 讀 ConnectionStrings 節點 ConnectionName 的連接字符串 5 /// 節點不存在時返回 null 6 /// </summary> 7 public static string GetConnectionStringConfig(string ConnectionName) 8 { 9 if (ConfigurationManager.ConnectionStrings[ConnectionName] == null) 10 return null; 11 return ConfigurationManager.ConnectionStrings[ConnectionName].ConnectionString.ToString(); 12 } 13 14 /// <summary> 15 /// 獲得指定配置節點的值 16 /// 節點不存在時返回 null 17 /// </summary> 18 public static string GetAppConfig(string strKey) 19 { 20 if (ConfigurationManager.AppSettings[strKey] == null) 21 return null; 22 return ConfigurationManager.AppSettings[strKey].ToString(); 23 } 24 25 // 寫 Config 不穩定 26 public static void AddConnectionStringConfig(string newName, string newConString, string newProvideName) 27 { 28 // 新建一個連接字符串 29 ConnectionStringSettings mySettings = new ConnectionStringSettings(newName, newConString, newProvideName); 30 // 打開配置文件 31 //Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 32 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 33 if (ConfigurationManager.ConnectionStrings[newName] != null) 34 config.ConnectionStrings.ConnectionStrings.Remove(newName); 35 // 添加新的連接字符串 36 config.ConnectionStrings.ConnectionStrings.Add(mySettings); 37 // 保存對配置文件的更改 38 config.Save(ConfigurationSaveMode.Minimal); 39 ConfigurationManager.RefreshSection("connectionStrings"); 40 } 41 42 public static void AddAppConfig(string newKey, string newValue) 43 { 44 //Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 45 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 46 if (ConfigurationManager.AppSettings[newKey] != null) 47 config.AppSettings.Settings.Remove(newKey); 48 config.AppSettings.Settings.Add(newKey, newValue); 49 config.Save(ConfigurationSaveMode.Minimal); 50 ConfigurationManager.RefreshSection("appSettings"); 51 } 52 }