1. 程式人生 > >Web.config檔案配置詳解

Web.config檔案配置詳解

一、認識Web.config檔案

Web.config檔案是一個XML文字檔案,它用來儲存 ASP.NET Web 應用程式的配置資訊(如最常用的設定ASP.NET Web 應用程式的身份驗證方式),它可以出現在應用程式的每一個目錄中。當你通過VBNET新建一個Web應用程式後,預設情況下會在根目錄自動建立一個預設的 Web.config檔案,包括預設的配置設定,所有的子目錄都繼承它的配置設定。如果你想修改子目錄的配置設定,你可以在該子目錄下新建一個Web.config檔案。它可以提供除從父目錄繼承的配置資訊以外的配置資訊,也可以重寫或修改父目錄中定義的設定。

在執行時對Web.config

檔案的修改不需要重啟服務就可以生效(注:<processModel> 節例外)當然Web.config檔案是可以擴充套件的。你可以自定義新配置引數並編寫配置節處理程式以對它們進行處理。

二、Web.config配置檔案

Web.Config是以xml檔案規範儲存, 所有的程式碼都應該位於<configuration>節點之間,配置檔案主要分為以下格式:

1、配置節處理程式宣告

特點:位於配置檔案的頂部,包含在<configSections>標誌中。

2、配置節組

特點: <sectionGroup>標記,可以自定義分組,可以放到

<configSections>內部或其它<sectionGroup>標記的內部。

3、特定應用程式配置

特點: 位於<appSetting>中。可以定義應用程式的全域性常量設定等資訊。

4、配置節設定

特點: 位於<system.web>節中,控制asp.net執行時的行為。

三、配置節的每一節

1<configuration>節根元素,其它節都是在它的內部。

2<appSetting>節此節用於定義應用程式設定項。對一些不確定設定,還可以讓使用者根據自己實際情況自己設定。

3<compilation>

格式:<compilation defaultLanguage="c#" debug="true"/>

Idefault language定義後臺程式碼語言,可以選擇c#vb.net兩種語言。

IIdebugtrue時,啟動aspx除錯;為false不啟動aspx除錯,因而可以提高應用程式執行時的效能。一般程式設計師在開發時設定為true,交給客戶時設定為false.

4<customErrors>

格式: <customErrors  mode="RemoteOnly"  defaultRedirect="error.aspx">

                  <error statusCode="440" redirect="err440page.aspx"/>

<error statusCode="500" redirect="err500Page.aspx"/>

</customErrors>

Imode:具有OnOffRemoteOnly 3種狀態。On表示始終顯示自定義的資訊;Off表示始終顯示詳細的asp.net錯誤資訊;RemoteOnly表示只對不在本地Web伺服器上執行的使用者顯示自定義資訊。

IIdefaultRedirect:用於出現錯誤時重定向的URL地址,是可選的。

IIIstatusCode:指明錯誤狀態碼,表明一種特定的出錯狀態。

IVredirect:錯誤重定向的URL

5<globalization>

格式:<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8"/>

IrequestEncoding:它用來檢查每一個發來請求的編碼。

IIresponseEncoding:用於檢查發回的響應內容編碼。

IIIfileEncoding:用於檢查aspx,asax等檔案解析的預設編碼。

6<sessionState>

格式:<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424"

sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20"/>

Imode:分為offInprocStateServerSqlServer幾種狀態。

    Mode="InProc"儲存在程序中特點:具有最佳的效能,速度最快,但不能跨多臺伺服器儲存共享。mode = "StateServer" 儲存在狀態伺服器中特點:當需要跨伺服器維護使用者會話資訊時,使用此方法。但是資訊儲存在狀態伺服器上,一旦狀態伺服器出現故障,資訊將丟失。mode="SqlServer"儲存在sql server中特點:工作負載會變大,但資訊不會丟失。

IIstateConnectionString:指定asp.net應用程式儲存遠端會話狀態的伺服器名,預設為本機。

IIIsqlConnectionString:當用會話狀態為資料庫時,在這裡設定連線字串。

IVCookieless:設定為true時,表示不使用cookie會話狀態來標識客戶;否則,相反。

VTimeOut:用來定義會話狀態儲存的時間,超過期限,將自動終止會話。

關於sessionState的詳細講解,請參考:

http://blog.csdn.net/yszwn/archive/2009/12/18/5033576.aspx

7<authentication>

格式:<authentication mode="Forms">

          <forms name=".ASPXUSERDEMO" loginUrl="Login.aspx" protection="All" timeout="30"/>

      </authentication>

該元素只能在計算機、站點或應用程式級別宣告。< authentication> 元素必需與<authorization> 節配合使用。驗證模式有以下四種:

IWindows:使用IIS驗證方式,IIS根據應用程式的設定執行身份驗證,(基本、簡要或整合 Windows)。在 IIS 中必須禁用匿名訪問。

IIForms:使用基於窗體的驗證方式,為使用者提供一個輸入憑據的自定義窗體(Web ),然後在您的應用程式中驗證他們的身份。使用者憑據標記儲存在Cookie中。

IIIPassport:採用Passport cookie驗證模式,"Passport"身份驗證是通過Microsoft的集中身份驗證服務執行的,它為成員站點提供單獨登入和核心配置檔案服務。

IVNone:不執行身份驗證。

裡面內嵌Forms節點的屬性涵義:

IName:指定完成身份驗證的Http cookie的名稱。

IILoginUrl:如果未通過驗證或超時後重定向的頁面URL,一般為登入頁面,讓使用者重新登入。

IIIProtection:指定 cookie資料的保護方式,可設定為:AllNoneEncryptionValidation四種保護方式。其中,All表示加密資料,並進行有效性驗證;Encryption表示對Cookie內容進行加密;validation表示對Cookie內容進行有效性驗證;None表示不保護Cookie

IVTimeOut:指定Cookie的失效時間,超時後要重新登入。

注:如果選擇的是Form驗證,在登入成功後要建立身份驗證票, 表明已經通過認證的合法使用者。例如:

if(IsLoadSucessful)

{

System.Web.Security.FormsAuthentication.SetAuthCookie(UserName, false)

}

8<authorization>

格式: <authorization><allow users="*"/></authorization>

//或者<authorization><deny users="?"/></authorization>

該節控制對 URL 資源的客戶端訪問(如允許匿名使用者訪問)。此元素可以在任何級別(計算機、站點、應用程式、子目錄或頁)上宣告。必需與<authentication> 節配合使用。

該節設定應用程式的授權策略。可以允許或拒絕不同的使用者或角色訪問應用程式資源。萬用字元: "*" 表示任何人,"?" 表示匿名 (未經身份驗證的)使用者。

注:如果拒絕匿名使用者訪問,但是有註冊頁面允許匿名使用者訪問,需要新增<location path="userReg.aspx">,這表示允許匿名使用者訪問userReg.aspx頁面,這段程式碼應該新增在<configuration><system.web>之間,而不應該包含到<system.web>..</system.web>之間。另外,你可以使用user.identity.name來獲取已經過驗證的當前的使用者名稱;可以使用web.Security.FormsAuthentication.RedirectFromLoginPage方法將已驗證的使用者重定向到使用者剛才請求的頁面。

9<httpRuntime>

格式:<httpRuntime maxRequestLength="4096" executionTimeout="60" appRequestQueueLimit="100"/>

該節配置 ASP.NET HTTP 執行庫設定,可以在計算機、站點、應用程式和子目錄級別宣告。

ImaxRequestLength:控制使用者上傳檔案,單位為KB

IIexecutionTimeout:最長時間,單位為S

IIIappRequestQueueLimit:最多請求數。

10<pages>

格式:<pages buffer="true" enableViewStateMac="true" validateRequest="false"/>

該節標識特定於頁的配置設定(如是否啟用會話狀態、檢視狀態,是否檢測使用者的輸入等),可以在計算機、站點、應用程式和子目錄級別宣告。

格式示例的意思為不檢測使用者在瀏覽器輸入的內容中是否存在潛在的危險資料(注:該項預設是檢測,如果你使用了不檢測,一要對使用者的輸入進行編碼或驗證),在從客戶端回發頁時將檢查加密的檢視狀態,以驗證檢視狀態是否已在客戶端被篡改。(注:該項預設是不驗證)

11<trace>

格式:trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />

Ienabled:表示是否啟用跟蹤

IIrequestLimit:表示指定在伺服器上儲存的跟蹤請求的數目。

IIIpageOutput="false"表示只能通過跟蹤實用工具訪問跟蹤輸出。

IVtraceMode="SortByTime"表示以處理跟蹤的順序來顯示跟蹤資訊。

VlocalOnly="true" 表示跟蹤檢視器 (trace.axd) 只用於宿主 Web 伺服器。

四、自定義配置檔案

為了增加應用程式的可移植性,通常網站需要配置一些自定義的節點,例如:檔案上傳的路徑等,再深入的應用,可以定義工廠方法需要建立的類。

第一種方式是在<appSetting>節點中增加自定義配置,例如:

 

 

第三種方式是在configSections節點下定義自定義節點,這種方式是我們在用第一種方式不宜使用的情況下的最佳使用方式。

首先定義自己的節點,定義自己的節點必須在configSections節點中,定義方法如下:

sectionGroup 元素充當 section 元素的容器,section 元素將配置節處理程式與配置元素或節關聯。由於 ASP.NET 不對如何處理配置檔案內的設定作任何假設,因此這非常必要。但 ASP.NET 會將配置資料的處理委託給配置節處理程式,(稍候說明。)每個 section 元素均標識一個配置節或元素。可以在 sectionGroup 元素中對 section 元素進行邏輯分組,以對 section 元素進行組織並避免命名衝突。section sectionGroup 元素包含在 configSections 元素中。

sectionGroup節點屬性:

name:必選的 String 屬性,這是 group 元素在配置檔案的節設定區域中使用的名稱。

section節點屬性:

name:必選的 String 屬性,指定與 type 屬性中指定的配置節處理程式關聯的配置節或元素的名稱。這是該元素在配置檔案的節設定區域中使用的名稱。

type:必選的 String 屬性,指定用來執行如下操作的配置節處理程式類的名稱:處理在 name 屬性中指定的節或元素中的配置設定。

現在定義好了自己的節點,可以使用該節點了。使用方法如下:

定義好了自己的節點,如何讀取節點資訊呢?以下是msdn上的原話:

您可以用自己的 XML 配置元素來擴充套件標準的 ASP.NET 配置設定集。若要完成該操作,您必須建立自己的配置節處理程式。該處理程式必須是一個實現 System.Configuration.IConfigurationSectionHandler 介面或 System.Configuration.ConfigurationSection 類的 .NET Framework 類。

節處理程式解釋並處理 Web.config 檔案特定部分中 XML 配置元素中定義的設定,並根據配置設定返回適當的配置物件。處理程式類返回的配置物件可以是任何資料結構;它不限於任何基配置類或配置格式。ASP.NET 使用該配置物件,以對自定義配置元素進行讀取和寫入。

上面這段話的意思就是說,我們要定義一個類,這個類要繼承自System.Configuration.IConfigurationSectionHandler 介面或 System.Configuration.ConfigurationSection 類。

然後用這個類來處理我們自定義的節點。

我們看到System.Configuration.IConfigurationSectionHandler介面中,只有一個方法:

 

返回值

建立的節處理程式物件。

這個類是幹什麼用的呢?讓我們通過一個例子來看看。

首先,我們新建一個網站專案,並在web.config中加入以下節點:

以上我們在WebSiteInfo節點下定義了兩個節點basicInfofileUpload,並定義了節點處理程式類ConfigurationSectionTest.WebSiteInfoHandler,並且隨後運用了我們定義的節點。

我們來看看節點處理程式ConfigurationSectionTest.WebSiteInfoHandler

任意建立一個專案,新建一個類,或者直接在App_Code裡新建一個類,如下:

並在Create函式中設定一個斷點。

  

然後在Default.aspxPage_Load事件處理程式中去訪問我們自定義的節點,並在ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"); 這條語句上設定斷點。

  

好了,我們啟動除錯,看到程式首先執行到ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");這句。

然後執行到ConfigurationSectionTest.WebSiteInfoHandler中的Create函式。

我們再看看這時處理函式中引數的值:

parentnull

configContext 為配置上下文物件。

section InnerXml<add key="name" value="huchen's homepage" /><add key="version" value="1.0" />

 

F11繼續執行return "hello", 繼續執行...

在執行到Object o = ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo")後面的“}“,我們發現o的值為”hello”

 

相信您已經明白的差不多了,當讀取自定義節點的內容時,程式去執行我們定義的節點處理程式,並把節點中的內容傳給Create函式中的引數。然後我們在Create中自己處理節點下的內容,並返回我們格式化後的節點內容給呼叫者,也就是ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo")

好,知道這些以後,我們就來完善我們的程式碼,我們在Create中處理傳進來的節點內容。 

為了簡單起見,我們引入兩個類NameValueCollectionNameValueSectionHandler

NameValueCollection:表示可通過鍵或索引訪問的關聯 String 鍵和 String 值的集合。

NameValueSectionHandler:提供配置節中的名稱/值對配置資訊。NameValueSectionHandler 這個類也繼承IConfigurationSectionHandler
反編譯可以看出NameValueSectionHandler Create方法把引數section的結果轉化成了一個集合,就是NameValueCollection

那麼我們可以在節點處理程式中的Create函式中寫如下程式碼:

NameValueCollection configs;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
configs =(NameValueCollection)baseHandler.Create(parent,configContext,section);
Return configs;

這樣我們就可以這樣訪問我們的節點了:

string myWebSiteName = ((NameValueCollection)ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"))["name"];
Response.Write(myWebSiteName);

Ctrl+F5執行,可以看到頁面輸出了huchen's homepage 

以上關於自定義節點的第三種方法引自:http://www.cnblogs.com/huc87/archive/2009/05/06/1450981.html