基于動態(tài)修改App.Config與web.Config的使用詳解
首先假設(shè)你的應(yīng)用程序配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="name" value="old"/>
</appSettings>
</configuration>
Ok,那么如何在運行時去修改name的值呢??
有很多童鞋會說可以使用Xml讀取配置文件,然后xxx。。。。
當(dāng)然這種方法肯定可以解決問題,有沒有其他方法呢??
在這里我要介紹一種比較簡單的方法,可能已經(jīng)有人知道了,那就是使用ConfigurationManager類
ConfigurationManager 存在System.Configuration.dll 中。
代碼如下: private static void ChangeConfiguration() Configuration config = ConfigurationManager.OpenExeConfiguration(assemblyConfigFile); //刪除name,然后添加新值 //保存配置文件
public static void Main()
{
Console.WriteLine(ConfigurationManager.AppSettings["name"]);
ChangeConfiguration();
Console.WriteLine(ConfigurationManager.AppSettings["name"]);
Console.ReadLine();
}
{
//讀取程序集的配置文件
string assemblyConfigFile = Assembly.GetEntryAssembly().Location;
//獲取appSettings節(jié)點
AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
appSettings.Settings.Remove("name");
appSettings.Settings.Add("name", "new");
config.Save();
}
代碼很簡單:首先讀取配置文件,接著獲取appSettings節(jié)點,然后修改,接著保存。
運行:結(jié)果如下:
可以看到輸出的值是兩個old.
為什么??
查找msdn文檔可以發(fā)現(xiàn)微軟出于性能考慮,對ConfigurationManager采用了緩存策略,所以如果要讀取新的值,應(yīng)該使用ConfigurationManager的RefreshSection來進行刷新,
ConfigurationManager . RefreshSection:
刷新命名節(jié),這樣在下次檢索它時將從磁盤重新讀取它。
于是將Main方法修改為:
Console.WriteLine(ConfigurationManager.AppSettings["name"]);
ChangeConfiguration();
ConfigurationManager.RefreshSection("appSettings");
Console.WriteLine(ConfigurationManager.AppSettings["name"]);
重新清理解決方案,重新運行:
可以看到,仍然是兩個old。。。
為什么??
難道值沒有修改??,我們打開應(yīng)用程序的配置文件,可以通過監(jiān)視assemblyConfigFile獲得路徑
上面是xxx\bin\Debug\CAStudy.exe.,對應(yīng)的配置文件就是CAStudy.exe.config
文件的內(nèi)容如下:
可以發(fā)現(xiàn)value 值已經(jīng)更改,那么為什么輸出還是old,old 呢??
為了驗證不是VS2010的問題。
首先手動將CAStudy.exe.config 文件中的value改為”old”,接著再次運行CAStudy.exe 結(jié)果如下:
可以看到輸出時old,和new。為什么會這樣???
難道調(diào)試時讀取的不是修改的配置文件,或者修改的配置文件并不是調(diào)試的應(yīng)用程序讀取的文件??
在assemblyConfigFile 中設(shè)置斷點,可以發(fā)現(xiàn)assemblyConfigFile 讀取的是CAStudy.exe.Config。但是vs調(diào)試的時候運行的是CAStudy.vshost.exe。也就是說我們使用ConfigurationManager.OpenExeConfiguration 打開的是CAStudy.exe.config文件,但是我們調(diào)試的應(yīng)用程序CAStudy.vshost.exe使用的是CAStudy.vshost.exe.config文件。
那么還有其他的方式可以準(zhǔn)確的獲取應(yīng)用程序配置文件嗎??
有的,使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
將ChangeConfiguration()方法修改如下: //讀取程序集的配置文件 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //獲取appSettings節(jié)點 //刪除name,然后添加新值 //保存配置文件
private static void ChangeConfiguration()
{
string assemblyConfigFile = Assembly.GetEntryAssembly().Location;
string appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
appSettings.Settings.Remove("name");
appSettings.Settings.Add("name", "new");
config.Save();
}
清理,重新運行:
使用默認(rèn)的不傳遞字符串的版本就可以打開當(dāng)前配置文件了。
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
如果要查看當(dāng)前配置文件的完整路徑可以使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
重新運行,結(jié)果如下:
另外值得一提的是:ConfigurationManager.RefreshSection 不支持section Group.所以對于WCF的服務(wù),你必須一個一個的RefreshSection:
ConfigurationManager.RefreshSection("system.serviceModel/behaviors");
ConfigurationManager.RefreshSection("system.serviceModel/bindings");
ConfigurationManager.RefreshSection("system.serviceModel/client");
ConfigurationManager.RefreshSection("system.serviceModel/services");
- ASP.NET web.config中數(shù)據(jù)庫連接字符串connectionStrings節(jié)的配置方法
- IIS7.5使用web.config設(shè)置偽靜態(tài)的二種方法
- 圖解修改IIS web.config配置文件增設(shè)置默認(rèn)文檔的方法
- web.config配置連接字符串的方法
- .NET的file文件上傳控件使用方法 修改web.config文件上傳大文件
- ASP.NET配置文件Web.config用法詳解
- C#獲取web.config配置文件內(nèi)容的方法
- web.config使用方法指南
- 詳解ASP.NET配置文件Web.config
- SQL Server數(shù)據(jù)庫連接 Web.config如何配置
相關(guān)文章
c#只讀字段和常量的區(qū)別,以及靜態(tài)構(gòu)造函數(shù)的使用實例
這篇文章主要介紹了c#只讀字段和常量的區(qū)別,以及靜態(tài)構(gòu)造函數(shù)的使用實例,有需要的朋友可以參考一下2013-12-12C#實現(xiàn)利用Windows API讀寫INI文件的方法
這篇文章主要介紹了C#實現(xiàn)利用Windows API讀寫INI文件的方法,涉及C#針對ini文件的創(chuàng)建、讀取及寫入等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07c#中的浮點型轉(zhuǎn)整形的舍取 四舍五入和銀行家舍入實現(xiàn)代碼
c#中的浮點型轉(zhuǎn)整形的舍取 四舍五入和銀行家舍入實現(xiàn)代碼,學(xué)習(xí)c#的朋友可以參考下2012-03-03Entity?Framework映射TPH、TPT、TPC與繼承類
這篇文章介紹了Entity?Framework映射TPH、TPT、TPC與繼承類,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06C#判斷指定驅(qū)動器是否是Fat分區(qū)格式的方法
這篇文章主要介紹了C#判斷指定驅(qū)動器是否是Fat分區(qū)格式的方法,涉及C#中DriveFormat屬性的使用技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04Unity2021發(fā)布WebGL與網(wǎng)頁交互問題的解決
本文主要介紹了Unity2021發(fā)布WebGL與網(wǎng)頁交互問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C#實現(xiàn)TreeView節(jié)點拖拽的方法
這篇文章主要介紹了C#實現(xiàn)TreeView節(jié)點拖拽的方法,涉及C#針對TreeView節(jié)點的動態(tài)添加及移除技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09