2009年7月22日 星期三

探討.NET Configuration Files 1-2

RunPC 112、113期:在.NET上保存應用程式設定(四)

應用程式配置檔案(Application Configuration Files)
應用程式配置檔案顧名思義它是用來配置應用程式特有的配置檔案,它的名稱和位置取決於應用程式的主應用程式 (Host),可以是下列其中一個:可執行檔裝載的應用程式、ASP.NET 裝載的應用程式、Internet Explorer 裝載的應用程式。
1、可執行檔裝載的應用程式
可執行檔裝載的應用程式它包含了視窗表單(Windows Froms)和主控台(Console-Base)的應用程式,可執行的主應用程式裝載的應用程式配置檔案位在與應用程式相同的目錄。配置檔案的副檔名為 .config,而其名稱為應用程式名稱(含.exe)加上.config。例如,稱為MyApp.exe 的應用程式可以和稱為 MyApp.exe.config 的配置檔案相關聯。
2、ASP.NET 裝載的應用程式
ASP.NET 裝載的應用程式它包含了ASP.NET Web 應用程式和ASP.NET Web服務,ASP.NET 配置檔案稱為 Web.config它位於虛擬目錄下的根節點或其子目錄下,在一個ASP.NET Web 應用程式中可以有多個 Web.config檔案,若您要求執行子目錄下的aspx頁面,它會先參考較靠近該aspx頁面下的web.config檔案內的設定值,若找不到相關設定值才會往上一層目錄參考其Web.Config檔案內的設定值直至虛擬目錄下的Web.Config檔案,若依舊沒有相關的設定值則會尋找電腦配置檔案內是否有提供其配置值,若皆沒有則出現圖一的錯誤。換言之,ASP.NET應用程式中頁面所參考的配置檔案是結合電腦配置檔案和各層目錄下的Web.Config檔案,若設定值有衝突時則以較靠近頁面的Web.Config設定值為主,請參考範例。
3、Internet Explorer 裝載的應用程式
如果裝載於 Internet Explorer 的應用程式具有配置檔案,這個檔案的位置會以下列語法在 < link> 標記中指定: < link rel="ConfigurationFileName" href="location"> 這個標記中,location 為配置檔案的 URL。這會設定應用程式基底。配置檔案必須位在與應用程式相同的 Web 網站。
範例:
1、 建立ASP.NET Web應用程式專案[ProWebConfig]。
2、 將專案中WebForm1.aspx更名為RootForm.aspx。
3、 在專案中建立Sub1與Sub2子資料夾,又在Sub1中建立Sub1_1子資料夾。
4、 在各子資料夾中加入新項目Web配置檔案(Web.config),在各配置檔中配置appSettings區段,而區段內加入一項目key為dsn,其值為Root_DSN、Sub1_DSN、Sub2_DSN、Sub1_1_DSN。
5、 在各子資料夾中加入Web Form,其名稱各為frmSub1.aspx、frmSub2.aspx、frmSub1_1.aspx。
6、 在各表單的Form_Load事件中加入Response.Output.WriteLine(ConfigurationSettings.AppSettings("dsn"))這行程式碼。
7、 在RootForm.aspx中加入三個HyperLink,其NavigateUrl屬性各指定為Sub1/frmSub1.aspx、Sub2/frmSub2.aspx、Sub1_1/frmSub1_1.aspx。
8、 執行測試,各表單取得的dsn鍵其值皆為最靠近表單的Web.config設定值。
9、 您可試將Sub1資料夾下的appSettings區段拿掉,再看frmSub1.aspx中取得該dsn鍵的值會是如何呢?
使用AppSettings來自訂配置檔案設定
當對各配置檔案做簡單說明後,接下接我們要為各位介紹配置檔案內的配置區段宣告與自訂的應用程式設定的關係,對它們的結構描述與各屬性所代表的意義來作簡單的介紹。一般我們會將對應用程式的喜愛設定和相關的狀態資訊存放在配置檔案的項目區段內,如:資料庫的連結設定等。其結構描述如下:

如前所述在所有配置檔案中皆是以< configuration>為根節點,是故< appSettings>項目區段亦是包含在其內。< add>項目的加入是表加入一個key/value成對的自訂的應用程式設定;< remove>項目是表來從您的應用程式中移除已在配置檔案階層架構較高層級中定義的設定,如:在應用程式配置檔案中移除您於電腦配置檔案中的設定;< clear>項目是表從您的應用程式中移除所有已在配置檔案階層架構較高層級中定義的設定。而我們可以利用< appSettings>項目來自訂的應用程式設定,是因為現存的電腦配置檔案中已對< appSettings>項目作宣告,若宣告的配置區段與配置區段內容沒有對應上則會發生如(圖一)的錯誤。您可參考下面電腦配置檔(machine.config)的部份片斷如下:

電腦配置檔案依舊是以< configuration>為根節點,而< configSections>項目是用來對配置區段和命名空間宣告,要特別注意的是當這個項目位於配置檔案中,則它必須是位於 < configuration> 項目的第一個子項目,其子項目請參考(表三)。

表三:< configSections>下的子項目

在程式中我們可利用ConfigurationSettings.AppSettings(key)[註1]來取得該key所對應的value,若您要將在該區段中的Key/Value值列出,請參考下面的程式碼:

利用For Each取得區段中的每一個鍵的名稱,再利用ConfigurationSettings.AppSettings帶入鍵的名稱取得對應的配對值,字串組合後用Response.Output.WriteLine[註2]列印於網頁上,當完成使用AppSettings來自訂配置檔案設定後,接下來讓我們在應用程式配置檔案中自訂一個配置區段。

註1:請參考下面ConfigurationSettings類別的說明。
註2:此處您亦可利用Respose.Write將結果印於網頁上,但若要分行則必需於每個字串結尾中串接< Br>字串以利分行,實為繁複,是故我們可利用在Global.asax的BeginRequest中加入Response.Output.NewLine = "< br>"該行程式碼,以後在該應用系統中即可使用Response.Output.WriteLine來輸出俱有分行效果的字串喔!
應用程式配置檔案中自訂一個配置區段
我們以ASP.NET Web應用程式為例,在Web.config配置檔案中使用非事先定義的AppSettings區段:
在Web.config中指定新定義的區段MySingleSection

區段宣告中的type可以有NameValueSectionHandler、NameValueFileSectionHandler、SingleTagSectionHandler、DictionarySectionHandler、IgnoreSectionHandler…等系統中預先定義好的區段處理類別,來針對所對應的區段配置內容來做剖析,其相關的說明請見表四。此處我們定義一個區段名稱為MySingleSection,利用SingleTagSectionHandler區段處理類別來做剖析區段內容,而MySingleSection區段內容帶Key/Value成對屬性三對,是因為要配合選用SingleTagSectionHandler的處理器類別,您可以利用下面的程式碼取出Key/Value列表值:

ConfigurationSettings.GetConfig("MySingleSection")傳回一雜湊表,而Hashtable 類別以 IDictionary 介面為基礎,當然MySS的宣告亦可改為Dim MySS As HashTable,詳細的程式碼請見附件範例。

表四:預先定義好的區段處理類別

配置檔案群組化
當在多人團隊開發的環境中或整合系統專案時,我們在配置檔案的應用上一般會將其配置區段群組化,以確保不會與其他人團隊成員所定義的配置區段發生命名衝突,其定義說明您可以參考表三。而下面為群組化的配置檔案部份內容,首先宣告一區段群組MyGroup後在其子項目中宣告一區段MySection其type改為NameValueSectionHandler處理器類別,注意其區段內容結構描述因處理器類別不同而有所差異,必須採用XML節點(node) 結構描述而非原XML屬性(Attribute) 結構描述。

而在群組區段中我們可以使用下面的程式碼取得您所要的Key/Value列表值:

此處因為我們宣告區段MySection其type已改為NameValueSectionHandler處理器類別,是故它的回傳值為NameValueCollection物件,請見表四說明,它是取回MyGroup群組MySection區段配置下集合,詳細的程式碼請見附件範例。

沒有留言:

加入書籤: MyShare HemiDemi Baidu Google Bookmarks Yahoo! My Web PChome Del.icio.us Digg technorati furludn bookmark 其他更多書籤

BOOKS:New and Upcoming