.NET框架中的配置文件架構之概念篇

.NET框架中的配置文件架構之概念篇

[email protected] 2008.7.4

1 配置文件的定義

.NET框架中,配置文件是可以根據需要更改的 XML 文件。開發人員可以使用配置文件來更改設置,而不必重編譯應用程序。管理員可以使用配置文件來設置策略,以影響應用程序在計算機上運行的方式。 注意: 託管代碼可以使用 System.Configuration 命名空間中的類從配置文件中讀取設置,但不向這些文件寫入設置。 .NET中,配置文件是標準的 XML 文件。.NET Framework 定義了一組實現配置設置的元素。計算機配置文件、應用程序配置文件和安全配置文件是常見的三種配置文件。

1.1 計算機配置文件

計算機配置文件 Machine.config 包含應用於整個計算機的設置。該文件位於 %運行庫安裝路徑%/Config 目錄中(例如,C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727。注意,不是.NET框架所有版本都具有自己的Machine.config文件,例如V3.0V3.5就沒有,這是因爲這兩個版本基本上只是在V2.0的基礎上增加了一些類庫。不像V2.0是對V1.1的一次重大升級)。Machine.config 包含整個計算機範圍內的程序集綁定、內置遠程處理信道和 ASP.NET 的配置設置。

配置系統首先查看計算機配置文件(即Machine.config文件)中的 元素和開發人員可能定義的其他配置節。然後查看應用程序配置文件。爲使計算機配置文件可管理,最好將這些設置放在應用程序配置文件中。但是,將這些設置放在計算機配置文件中可以使系統更易維護。例如,如果有第三方組件,且客戶端和服務器應用程序同時使用該組件,那麼將該組件的設置放在一個位置更方便。在這種情況下,計算機配置文件是存放設置的合適位置,這樣就不會將相同的設置放在兩個不同的文件中。

1.2 應用程序配置文件

應用程序配置文件包含特定於單個應用程序的設置。該文件包含公共語言運行庫可以讀取的配置設置(如程序集綁定策略、遠程處理對象等),以及應用程序可以讀取的設置。根據應用程序宿主的不同,應用程序文件可以分爲下面三種類型:

  1. 可執行文件承載的應用程序。由可執行文件宿主承載的應用程序的配置文件與該應用程序位於同一目錄。配置文件的名稱是帶有 .config 擴展名的該應用程序的名稱。例如,名爲 myApp.exe 的應用程序可以與名爲 myApp.exe.config 的配置文件關聯
  2. ASP.NET 承載的應用程序。有關 ASP.NET 配置文件的更多信息,請參見 ASP.NET 配置
  3. Internet Explorer 承載的應用程序。如果 Internet Explorer 承載的應用程序有配置文件,那麼該文件的位置在 />標記中指定,其語法如下: <link rel=" ConfigurationFileName " href=" location "> 在該標記中,location 是指向該配置文件的 URL。它設置了應用程序基。配置文件必須位於與應用程序所在的同一網站中。

1.3 安全配置文件

安全配置文件包含有關與策略級別關聯的代碼組層次結構和權限集的信息。鄭重建議使用 .NET Framework 配置工具 (Mscorcfg.msc) 或代碼訪問安全策略工具 (Caspol.exe) 來修改安全策略,以確保策略更改不會破壞安全配置文件。

我們經常使用的應用程序有桌面應用程序,例如Word,和Web應用程序,即近些年迅猛發展的網站。它們的配置方法基本相同,下面以Web應用程序的配置爲例進行說明。

2 ASP.NET配置文件架構

ASP.NET 配置文件爲 XML 文件。.NET Framework 定義了一組實現配置設置的元素,並且 ASP.NET 配置架構包含控制 ASP.NET Web 應用程序的行爲的元素。

默認配置設置在位於 %SystemRoot%/Microsoft.NET/Framework/versionNumber/CONFIG/ 目錄中的 Machine.config file 文件中指定。值由子站點和應用程序繼承。如果子站點或應用程序中有配置文件,則繼承的值不會出現,但可以被重寫並可用於該配置 API

注意:每個配置文件必須恰好包含一個元素。

system.web元素指定ASP.NET配置節的根元素,幷包含用於配置ASP.NET Web應用程序和控制應用程序行爲的配置元素。位於system.web中的各個元素都是微軟定義的,其中包含經常使用的authenticationauthorizationcachingcustomErrorshttpCookieshttpHandlershttpModulesmembership等。我們可以通過設置它們的值來改變ASP.NET應用程序的行爲。圖1展示了我們馬上可以使用的配置元素。

1 system.web元素結構

除了system.web元素,還有一些常規配置元素,如圖2所示,與system.web不同,這些元素也適用於.NET框架應用程序,例如在智能客戶端應用程序中也可以使用。注意,配置元素形成一個樹狀結構,隨着元素位置的不同,它可以具有父元素或子元素,例如appSetting元素的父元素爲configuration元素,子元素有add, clear, remove

2 configuration元素結構

另外每個元素又擁有數量不同的特性(特性和屬性是兩個很容易混淆的術語,它們分別對應於英文中的attributepropertyC#一般用屬性封裝字段,而一般使用特性來定義那些需要寫入元數據的信息或者用在XML中。我一直有一個想法,那就是希望我們國家能成立一個標準委員會,負責將英文技術術語翻譯成中文並強制執行。這是因爲我見過太多的譯著,先不說譯者的翻譯水平怎麼樣,單說術語的翻譯,那叫一個混亂,你翻譯成一,我翻譯成二,弄得讀者不知所措。也正是因爲這個原因,建議大家儘量閱讀英文原版資料。當然現在的很多譯者都是微軟MVP,他們的翻譯水平還是可以接收的),例如appSettings元素具有特性file(它沒有在圖2中列出)。 <appSettings    file="relative file name" > </appSettings> 指定包含自定義應用程序配置設置的外部文件的相對路徑。指定的文件包含的設置類型與在 appSettingsaddclear remove 屬性中指定的設置類型相同,並且使用的鍵/值對格式也與這些元素相同。(下面兩段和備註可以略過,在需要的時候再看不遲) 指定的路徑是本地配置文件的相對路徑。如果找不到指定的文件,運行庫會忽略該屬性。由於 Web.config 文件的任何更改都會導致應用程序重新啓動,因此,使用一個單獨的文件則既可以讓用戶修改 appSettings 節中的值,又不會導致應用程序重新啓動。該單獨文件的內容將與 Web.config 文件中的 appSettings 節合併。此功能限於 appSettings 屬性。

注意 .NET Framework 2.0 版中,現在可以在一個單獨文件包括所有支持 configSource 屬性的配置元素的配置設置。但是,當使用 configSource 屬性時,由於沒有元素設置的合併,因此您必須將整個節移動到單獨文件。使用 configSource 屬性時,對 Web.config 文件有一次寫入操作。這會導致應用程序重新啓動,但是隨後對該節的更新會直接寫入單獨文件,而不會導致後面的應用程序重新啓動。有關更多信息,請參見 ConfigSource

備註:您可以使用 file 特性指定一個配置文件,該配置文件提供其它設置或重寫 appSettings 元素中指定的設置。您可以將 file 屬性用於源代碼管理組開發方案,例如,當用戶需要重寫在應用程序配置文件中指定的項目設置時。在 file 屬性中指定的配置文件必須將 appSettings 元素(而不是 configuration 元素)作爲根節點。

appSettings 元素存儲自定義應用程序配置信息,如文件路徑、XML Web services URL 或存儲在應用程序的 .ini 文件中的任何信息。可以在代碼中使用 ConfigurationSettings 類訪問 appSettings 元素中指定的鍵/值對。

下面的代碼示例演示如何在配置文件中定義自定義應用程序設置。 <configuration>     <appSettings>         <add key="Application Name" value="MyApplication" />     </appSettings> </configuration>

configSections

section

定義配置節處理程序與配置元素之間的關聯。

sectionGroup

定義配置節處理程序與配置節之間的關聯。

configSections 元素指定了配置節和處理程序聲明。由於 ASP.NET 不對如何處理配置文件內的設置作任何假設,因此這非常必要。但 ASP.NET 會將配置數據的處理委託給配置節處理程序。

每個 section 元素標識一個配置節或元素以及對該配置節或元素進行處理的關聯 ConfigurationSection 派生類。可以在 sectionGroup 元素中對 section 元素進行邏輯分組,以對 section 元素進行組織並避免命名衝突。section sectionGroup 元素包含在 configSections 元素中。

注意:如果配置文件中包含 configSections 元素,則 configSections 元素必須是 configuration 元素的第一個子元素。

3 理解配置文件

如果只是閱讀這些枯燥的文檔,很快就會迷失方向,因爲包含了太多的術語,爲了加深理解讓我們瀏覽一下Machine.config文件,從中或許能夠有助於我們的理解。完整的machine.config文件可以在目錄 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG下找到,每個版本的.NET框架都會自帶一個machine.config文件,v2.0.50727爲版本號。下面的內容摘自 Machine.config 文件,用於定義 system.web 節中 authentication 元素的配置節處理程序。然後,定義 authentication 元素的配置設置。

<configuration>

<configSections>

	   <section name="system.data" type="System.Data.Common.DbProviderFactoriesConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

    <!-- Other configuration sections -->

        <sectionGroup name="system.web" type="System.Web.Configuration.SystemWebSectionGroup, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%">

            <section name="authentication" type="System.Web.Configuration.AuthenticationSection, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication" />

            <!-- Other system.web sections -->

	   	   <sectionGroup name="caching" type="System.Web.Configuration.SystemWebCachingSectionGroup, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

				<section name="cache" …/>

				<section name="outputCache" …/>

				<section name="outputCacheSettings" …"/>

				<section name="sqlCacheDependency" …/>

		   </sectionGroup>

        </sectionGroup>

        <!-- Other configuration sections -->

    </configSections>



    <system.web>

        <authentication mode="Windows">

            <forms name=".ASPXAUTH" 

                   loginUrl="login.aspx" defaultUrl="default.aspx" 

                   protection="All" 

                   timeout="30" 

                   path="/" 

                   requireSSL="False" 

                   slidingExpiration="True" 

                   cookieless="UseCookies" 

                   domain="" 

                   enableCrossAppRedirects="False">

                <credentials passwordFormat="SHA1" />

            </forms>

            <passport redirectUrl="internal" />

        </authentication>

        <!-- Other system.web elements -->

    </system.web>

    <!-- Other configuration settings -->

</configuration>

List-1 machine.config

下面我們去掉各個元素的特性定義,這樣可以更加清晰的瞭解它的總體架構。

<configuration>

<configSections>

  <section />

  <!--other sections />

<sectionGroup>

         <sectionGroup />

         <!--Other sectionGroup -->

<section />

<!--Other sections -->

<sectionGroup>

<!-- Other groups -->

<configSections>

<system.web />

<!-- Other configuration settings -->

</configuration>

總體上看,一個配置文件分爲紅色和藍色兩個部分,紅色部分爲元素設置區域,藍色部分爲設置區域。一般來說,我們只需要瞭解節設置區域即可,我們在這裏對應用程序的各個方面,例如httpHandlersmembership等,進行配置。當我們使用ASP.NET Web模板創建一個ASP.NET應用程序時,自動生成的Web.config文件中就只包含節設置區域。我們一般不需要關心元素設置區域,它包含了處理用戶配置的類的信息。一般只有當使用了自定義節時我們纔會關心元素設置區域。

配置文件的有且只有一個根元素,元素也是如此。元素包含兩類元素,而元素比較特殊,它還可以包含元素,例如system.websystem.net。從sectionGroup的字面意思不難理解,它的作用爲分組,即把一組功能類似的節歸類。

回想一下,我們在ASP.NET應用程序的web.config配置文件中可以對應用程序的各個方面進行配置,不知道朋友們有沒有想過.NET框架是如何解析配置參數的?其實很簡單,看看machine.config文件第52<sectionGroup name="system.web" type="System.Web.Configuration.SystemWebSectionGroup, System.Web, Version= .0, Culture=neutral, PublicKeyToken=b 03f5f7f 11d 50a3a ">一切就很簡單了。是的,在System.Web.Configuration.SystemWebSectionGroup類中!看看msdn對它的解釋吧?"SystemWebSectionGroup 類允許用戶以編程方式訪問配置文件的 system.web 組。無法繼承此類。SystemWebSectionGroup 類引用配置文件內的 system.web 組。可以使用此類型來訪問此組中包含的任意節"。看到這裏是不是明白了許多,此時你肯定也明白了元素屬性的含義。

<section name="compilation" type="System.Web.Configuration.CompilationSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>爲例,它的意思是:使用System.Web.Configuration.CompilationSection 類作爲compilation配置節處理程序,其中System.Web.Configuration.CompilationSection爲全限定類名,此類位於System.Web程序集中,版本號爲 .0Culture爲中性,PublicKeyTokenb 03f5f7f 11d 50a3a 。注意:程序集文件必須與定義它的 Web.config 文件位於同一個應用程序目錄中。對於根 Web.config 文件或 Machine.config 文件,程序集文件必須在 %SystemRoot%/Microsoft.NET/Framework/version 中。如果配置節處理程序不與某個配置元素關聯,ASP.NET 將發出服務器錯誤"無法識別的配置節 element_name"。

理解了.NET配置文件背後的工作原理之後,還存在一個問題,那就是如何向配置文件中添加我們的自定義節?不用着急,.NET框架的一個重要特點就是它的可擴展性。在下一節中讓我們來看看如何利用System.Configuration名字空間中的類自定義配置節。

後記

第一次學習微軟企業庫4.0,發現1.0版本的Configuration Application Block不見了,仔細的看了一下文檔,原來此appblock已經轉移到了企業庫核心中,其配置通過System.Configuration名字空間來提供。本文大部分字句都摘自MSDN文檔,其中夾雜着自己的一點理解和認識。接下來我會討論如何在程序中應用.NET配置。由於剛剛學習企業庫,所以錯誤在所難免,以後會逐步改進。文章先是在Word中編輯的,發佈過程很是費勁。爲什麼沒有文章的格式這麼難設置呢?只好委屈大家了。有沒有什麼好的離線發佈工具,推薦一下。

Powered by Zoundry

發佈了46 篇原創文章 · 獲贊 1 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章