它緩存,在性能的第一次訪問,所以它不會從物理文件中的每個你問一個值時讀取。這就是爲什麼有必要重新啓動Windows應用程序(或配置Refresh)以獲取最新值,以及爲什麼在編輯web.config時ASP.Net應用程序會自動重新啓動。爲什麼ASP.Net硬連線重啓在回答How to prevent an ASP.NET application restarting when the web.config is modified的參考文獻中討論。
我們可以驗證這一點使用ILSpy,看着System.Configuration的內部結構:
public static NameValueCollection AppSettings
{
get
{
object section = ConfigurationManager.GetSection("appSettings");
if (section == null || !(section is NameValueCollection))
{
throw new ConfigurationErrorsException(SR.GetString("Config_appsettings_declaration_invalid"));
}
return (NameValueCollection)section;
}
}
起初,這確實像它每次都會得到部分。看GetSection:
public static object GetSection(string sectionName)
{
if (string.IsNullOrEmpty(sectionName))
{
return null;
}
ConfigurationManager.PrepareConfigSystem();
return ConfigurationManager.s_configSystem.GetSection(sectionName);
}
這裏的關鍵線是PrepareConfigSystem()
方法;這將初始化由ConfigurationManager持有的IInternalConfigSystem
字段的一個實例 - 具體類型爲ClientConfigurationSystem
作爲此加載的一部分,將實例化Configuration類的實例。該類實際上是配置文件的對象表示,並且似乎由ClientConfigurationSystem的ClientConfigurationHost屬性在靜態字段中保存 - 因此它被緩存。
你可以做實證檢驗此以下(在Windows窗體或WPF應用程序):
- 啓動您的應用程式上
- 訪問的app.config
- 的值進行更改,以App.Config中
- 查看一下新的值是否存在
- 呼叫
ConfigurationManager.RefreshSection("appSettings")
- 檢查,看是否新的值存在。
其實,我可以救自己一些時間,如果我剛剛看了評論的RefreshSection方法:-)
/// <summary>Refreshes the named section so the next time that it is retrieved it will be re-read from disk.</summary>
/// <param name="sectionName">The configuration section name or the configuration path and section name of the section to refresh.</param>
你是什麼意思的「不總是」!這是設計我已經理解,IIS重新啓動應用程序並重新加載配置。 –