config中自定的config session是使用NameValueFileSectionHandler嗎?
您可以改使用 AppSettingsSection ,讓您的 config session 擁有一些客製、擴充的能力哦!
問題
我們的 web.config 中有自定的 Config Session ,我們使用的 Type 是 NameValueFileSectionHandler 。
當在裡面的設定值逾來逾多時,是否有什麼方式,可以讓它有擴充能力呢?
研究
1.將原本裡面的內設定值,分成多個 Group 放到額外的 config 檔,但這樣似乎就要調整原本取 Config 值的 Method 。
2.在擴充原有的 Config Session,將比較會異動的設定搬到另一個 config 檔,讓原有取 Config 值的 Method 可以運作。
目前 方法2 對原有系統的異動比較小,所以就用使用 方法2 來解決目前的問題。
實作
在 config 檔中的 appSettings 區段有 file 的屬性,就可以讓我們達到這樣的效果。
所以只要將原本的type改成 System.Configuration.AppSettingsSection 。
然後就可以把其他的設定移另一個 config 之中。
用以下的例子來說明比較清楚,
web.config 的內容,在 MyNewSettings 區段的 file 屬性設定 MyNewSettings_Ex.config。
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="MyOldSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <section name="MyNewSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </configSections> <MyOldSettings> <add key="1" value="one_Old"/> <add key="2" value="two_Old"/> </MyOldSettings> <MyNewSettings file="MyNewSettings_Ex.config"> <add key="1" value="one_New"/> <add key="2" value="two_New"/> </MyNewSettings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
MyNewSettings_Ex.config 的內容如下(root tag 要跟原本的一樣哦!),
<?xml version="1.0" encoding="utf-8"?> <MyNewSettings> <add key="1" value="one_New_Ex"/> <add key="3" value="three_New_Ex"/> </MyNewSettings>
所以程式可以透過原有 Method (GetConfigSettingValue),取得 MyOldSettings 及 MyNewSettings 的設定值,如下,
public static string GetConfigSettingValue(string sessionName, string keyName) { string result = string.Empty; var configSession = ConfigurationManager.GetSection(sessionName) as System.Collections.Specialized.NameValueCollection; if (configSession != null) { result = configSession[keyName]; } return result; } protected void Page_Load(object sender, EventArgs e) { //取得舊的設定值 1, 2 string myOldSessionName = "MyOldSettings"; Response.Write("<hr>MyOldSettings<br/>"); Response.Write(string.Format("Old Key:1, Value:{0} <br/>", GetConfigSettingValue(myOldSessionName, "1"))); Response.Write(string.Format("Old Key:2, Value:{0} <br/>", GetConfigSettingValue(myOldSessionName, "2"))); //取得新的設定值 1, 2, 3 string myNewSessionName = "MyNewSettings"; Response.Write("<hr>MyNewSettings<br/>"); Response.Write(string.Format("New Key:1, Value:{0} <br/>", GetConfigSettingValue(myNewSessionName, "1"))); Response.Write(string.Format("New Key:2, Value:{0} <br/>", GetConfigSettingValue(myNewSessionName, "2"))); Response.Write(string.Format("New Key:3, Value:{0} <br/>", GetConfigSettingValue(myNewSessionName, "3"))); }
依結果來看,在 MyNewSettings_Ex.config 裡可以覆寫及擴充原本 configSession (key 1, 3)。
PS. AppSettingsSection 也可以轉成 NameValueCollection 哦!
參考資料
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^