ASP.net中的配置文件學習

asp.net web.config的學習筆記

一直都對web.config不太清楚。這幾天趁着項目不緊趕緊再惡補下,發現確實是有很多原來不明白的地方。特意記錄下來,希望能與各位看官共同進步。

小弟自學筆記,有不對的地方還請大神指出來。

學習之前,我是抱着一個完全不知道的態度開始的。我想這個方法適用於很多地方,不是有個故事嗎:杯子裏的水倒掉才能裝進去更多的水。所以有很多地方記錄的都是挺基礎的知識,這也能照顧照顧新手。

1,什麼是web.config?

MSDN上說:"ASP.NET 配置數據存儲在 XML 文本文件中(每個文件都名爲 Web.config)。 Web.config 文件可以出現在 ASP.NET 應用程序的多個目錄中。"。  

在園子裏有爲大神的說話我覺得也計較容易理解“web.config是asp.net中保存配置信息(比如數據庫連接字符串等)的重要文件。它是基於xml的文本文件方式放在Web應用程序的任何目錄中,並且默認不隨源文件編譯到Dll中,而運行環境隨時監視着它是否有改變,一但有變動,系統會自動重新加載裏面的最新內容。”。

說到底就是網站的配置文件了。

2,web.config的加載順序

前邊既然提到了web.config可以在一個網站裏出現多個,那在網站運行時候服務器是怎樣去執行他們的呢?這就是要瞭解到web.config的加載順序了。

相信很多新手特別是沒有好好接觸過web.config知識的童鞋一直都對一個asp.net網站有很多個配置文件感到棘手,即新奇又感到迷茫,反正我以前是這樣的。但是現在知道了下面這些知識就不會了。

IIS在Asp.net網站啓動時,會加載配置文件中的配置信息,然後緩存這些信息,不會每次要用都去讀取配置文件,只是IIS會隨時監視着這些文件的變化,一量有變化,它會重新去讀取並緩存配置信息。

Asp.net網站運行時會按照以下方式加載配置文件中的節點信息:

1) 如果在當前運行頁面所在的目錄下有web.config文件,則查找是否存在所需要的節點,如果存在則返回結果,並停止下一步地查找。

2) 如裏所在目錄不存在web.config配置或者配置文件裏沒有所需要的節點,則查找它所在的上一級目錄的配置文件中的節點,直到網站根目錄。

3) 如果網站根目錄中都不存在web.config或者所需要的配置節點,轉而到“windows目錄\Microsoft.NET\Framework\對應.net版本\config\web.config”中去查找。

4) 如果第3條中還沒找到,繼續到“windows目錄\Microsoft.NET\Framework\對應.net版本\config\machine.config”中去查找。

5) 如果還沒找到,那就報錯吧。

可能對於第 3 步, 第 4 步有好多童鞋該不明白了,那個是 iis服務器的默認配置目錄。可以這樣簡單的理解:我們讓網站去找一個配置信息,那他肯定就會一層一層的去找配置文件裏的節點名稱,當網站目錄裏沒有找到的時候,服務器會找自己的配置文件。當這些都沒找到,報錯吧。

這樣理解了,就對一個asp.net網站擁有多個配置文件不足爲奇了吧。其實對於上邊說的這個問題,我覺得是在項目開發過程中養成良好的編程習慣就可以完全避免了。在配置文件的表示字段上,儘量不要有重複的。

3,web.config節點介紹。

這個纔是正文吖。因爲web.config節點有很多需要知道的地方,我們這裏只對那些常用的節點做介紹。

前邊說了,Web.config文件是一個xml文本文件。所以它的配置信息都是以節點形式存在的。

根節點爲<configuration>,常見的子節點有:<configSections> ,<appSettings> <connectionStrings>,<location>,<system.web>等等。

<configSections />

這是什麼玩意?

我們平時在網站裏用到的一些對象或者數據,是配置在web.config裏的,但是配在哪呢?就是配置在這個configSections節點下。

web.config是網站運行在iis服務器上的配置文件,他怎麼可能允許我們隨隨便便的配置我們自己的節點呢,不行你自己試試, 在任何位置添加任何沒有申明的節點, 系統都不會讓你通過, 更不會讓你去讀它了, 當然, 你打算在別的xml文件裏添加節點, 然後讀出來, 創建對象, 這個沒問題。不過這樣一樣也就失去了配置文件的意義了。所以,爲了系統能有組織的管理用戶的在配置文件裏的自定義信息, 就要使用configSections了。

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

<configSections>

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

<section />

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

<sectionGroup />

<!--移除對繼承的節和節組的引用。-->

<remove />

<!--移除對繼承的節和節組的所有引用,只允許由當前 section 和 sectionGroup 元素添加的節和節組。-->

<clear/>

</configSections>

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

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

下面我們來示例寫一個自定義配置信息,並完成它的SectionHandler.

1,首先我們在<configuration>節點下添加configSections。

<configSections>
    <sectionGroup name="WebSiteInfo">
        <section name="basicInfo" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
        <section name="fileUpload" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
    </sectionGroup>
</configSections>

<WebSiteInfo>
    <basicInfo>
        <add key="name" value="imecc studio"/>
        <add key="version" value="1.0"/>
    </basicInfo>
    <fileUpload>
        <add key="fileUploadPath" value="E:\\MyHomePage\\Web\\Upload\\"/>
        <add key="fileUploadSizeMax" value="2M"/>
    </fileUpload>
</WebSiteInfo>

說明: 在configSections下添加一個section/sectionGroup子節點, 寫好標示名和類型, 然後在緊接這下面實現這個標示名的細節內容,就是我們當初想添加的自己的自定義信息了.

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

2,我們來看看節點處理程序ConfigurationSectionTest.WebSiteInfoHandler。

任意建立一個項目,新建一個類,或者直接在App_Code裏新建一個類,如下:

namespace ConfigurationSectionTest
{
    /// <summary>
    ///WebSiteInfoHandler 的摘要說明
    /// </summary>
    public class WebSiteInfoHandler : IConfigurationSectionHandler
    {
        public WebSiteInfoHandler()
        {
            //
            //TODO: 在此處添加構造函數邏輯
            //
 
        }
 
        #region IConfigurationSectionHandler 成員
 
        public object Create(object parent, object configContext, System.Xml.XmlNode section)
        {
           //這裏我們首先返回個hello,並且在此處設置一個斷點。看看程序什麼時候執行到這。
            return "hello";
        }
 
        #endregion
    }
 
}

可以看到這個處理程序實現了一個叫做IConfigurationSectionHandler的接口,並且裏邊有個唯一的方法 public object Create(object parent, object configContext, XmlNode section), 這裏的最後一個參數就是自定義信息那個節點了,  通過處理你配置的這堆信息, 返回你要的對象.

3,要使用這個返回的對象,通過System.Configuration.ConfigurationManager.GetSection()方法.

  我們在Default.aspx的Page_Load事件處理程序中去訪問我們自定義的節點,用ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");注意參數的格式。

這裏是 section Group Name/section ,如果是單獨的section,就只傳這個section的name就好了。

protected void Page_Load(object sender, EventArgs e)
{
    Object o = ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");
}

在Page_Load的代碼段裏打個斷點我們啓動調試,看到程序首先執行到ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");這句。

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

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

parent爲null

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這個方法,第二次運行的時候就調試不到了,這是因爲配置文件時緩存了起來.

只有改變了配置文件或者繼承自IConfigurationSectionHandler的類纔會重新調用.

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

爲了簡單起見,我們引入兩個類NameValueCollection,NameValueSectionHandler。

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"];

在Default.aspx的Page_Load事件處理程序中添加如下代碼:

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

Ctrl+F5運行,可以看到頁面輸出了imecc studio

<appSettings />

該節點下主要用來存儲asp.net應用程序的一些配置信息,也可以把數據庫連接字符串也放在這裏,不過.net2.0提供了connectionStrings節點,所以數據庫連接字符串還是不建議放在這裏,下面爲一個圖片類型的實例。

<appSettings>

<!--圖片類型擴展名-->

<add key="ImgType" value=".bmp;.jpg;.gif;.png"/>

</appSettings>

調用方法爲:

string ImgType = ConfigurationManager.AppSettings["ImgType"];

<connectionStrings />

   connectionStrings和appSettings類似,不過用於保存配置數據庫連接信息,下面給一個實例。

<connectionStrings>

<add name="SqlserverConnStr" connectionString="Data Source=Aron1;Initial Catalog= pubs;UserId=sa;Password=asdasd;"/>

<add name="OrcleConnStr" connectionString="Provider=msdaora;Data Source= MyOracleDB;UserId=UserName;Password=asdasd;"/>

</connectionStrings>

調用方式爲:

string connStr = ConfigurationManager.ConnectionStrings["SqlserverConnStr"].ConnectionString;

<system.web />

<system.web>爲.net應用程序的行爲方式配置節點,該節點包含很多子節點,很多子節點已經由.net配置好了,這裏我們只來看看一些重要的配置節點。

<compilation />節點
<compilation>節點配置 ASP.NET 使用的所有編譯設置

默認的debug屬性爲“true”,即允許調試,在這種情況下會影響網站的性能,所以在程序編譯完成交付使用之後應將其設爲“false”。

 <customErrors />

該節點用於定義一些自定義錯誤信息

此節點有Mode和defaultRedirect兩個屬性,其中defaultRedirect屬性是一個可選屬性,表示應用程序發生錯誤時重定向到的默認URL,如果沒有指定該屬性則顯示一般性錯誤。Mode屬性是一個必選屬性,它有三個可能值,它們所代表的意義分別如下:
Mode 說明
On 表示在本地和遠程用戶都會看到自定義錯誤信息。
Off 禁用自定義錯誤信息,本地和遠程用戶都會看到詳細的錯誤信息。
RemoteOnly 表示本地用戶將看到詳細錯誤信息,而遠程用戶將會看到自定義錯誤信息。
這裏有必要說明一下本地用戶和遠程用戶的概念。當我們訪問asp.net應用程時所使用的機器和發佈asp.net應用程序所使用的機器爲同一臺機器時成爲本地用戶,反之則稱之爲遠程用戶。在開發調試階段爲了便於查找錯誤Mode屬性建議設置爲Off,而在部署階段應將Mode屬性設置爲On或者RemoteOnly,以避免這些詳細的錯誤信息暴露了程序代碼細節從而引來黑客的入侵。

值得一提的是:如果說配置的跳轉頁面也發生錯誤,那麼網站就沒辦法處理異常了。

<authentication />

該節點爲配置 ASP.NET 身份驗證方案,該方案用於識別查看 ASP.NET 應用程序的用戶。Mode屬性包含四種身份驗證模式:

1. Windows(默認)

將 Windows 驗證指定爲默認的身份驗證模式。將它與以下任意形式的 Microsoft Internet 信息服務 (IIS) 身份驗證結合起來使用:基本、摘要、集成 Windows 身份驗證 (NTLM/Kerberos) 或證書。在這種情況下,您的應用程序將身份驗證責任委託給基礎 IIS。

2. Forms

將 ASP.NET 基於窗體的身份驗證指定爲默認身份驗證模式。

3. Passport

將 Microsoft Passport Network 身份驗證指定爲默認身份驗證模式。

4. None

不指定任何身份驗證。您的應用程序僅期待匿名用戶,否則它將提供自己的身份驗證。

下面的代碼示例演示如何爲基於窗體的身份驗證配置站點、指定傳輸來自客戶端的登錄信息的 Cookie 的名稱以及指定當初始身份驗證失敗時使用的登錄頁的名稱。必須將 authorization 節包含在內才能要求對所有用戶進行 Forms 身份驗證,並拒絕匿名用戶訪問站點。

<configuration>

<system.web>

<authentication mode="Forms">

<forms name="401kApp" loginUrl="/login.aspx"/>

</authentication>

<authorization>

<deny users="?"/>

</authorization>

</system.web>

</configuration>

Login.aspx中登陸通過:

FormsAuthentication.RedirectFromLoginPage(this.TextBox1.Text, true);

<httpHandlers />

HttpHandlers可用於根據請求中指定的 URL 和 HTTP 謂詞將傳入的請求映射到相應的處理程序。也就是說對於網站的某一個請求,我們可以自定義他的一般處理程序。

相信有很多新手在剛剛入職的時候,會發現很多在學校學的知識(很多都是託控件)到了公司基本上就沒有用的地方,打開aspx對應的aspx.cs後置文件,裏邊一句自己寫的代碼都找不到。

很是鬱悶。其實很多都是用到了這個東西。

看下邊這個例子:

<system.web>
<httpHandlers>
<add path="httpHandlerTest.ashx" verb="*" type="aspDoNetTest.Handler.httpHandlerTest_Handler"/>
</httpHandlers>
</system.web>

我們配置了一個Test的handler的一般處理程序,用於實現自定義的用戶登錄。

傳統的我們在處理的時候,會在頁面上託兩個textbox,再來個Button,然後再Button的click event裏寫登錄的邏輯。

但是這樣配置的一個,當我們請求httpHandlerTest.ashx的時候,就會走我們的處理程序。

namespace aspDoNetTest.Handler
{
    public class httpHandlerTest_Handler:IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            string action =context.Request.QueryString["action"];
 
            switch (action)
            {
                case "Login":
                    Login(context);
                    break;
                case "1":
                    break;
                case "2":
                    break;
                default:
                    break;
            }
        }
 
        private void Login(HttpContext context)
        {
            string UserName = context.Request.QueryString["UserName"];
        }
 
        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}

  看到httpHandlerTest_Handler 類實現了IHttpHandler 接口。關於這個接口的知識,可以在網上找到他的專一學習知識。

 <httpModules />

   大家對於Global.asax應該挺熟悉的吧。對於那裏邊的HttpApplication時間,有些時候可能並不是我們想要的。這時候httpModules就用上了。

對於httpModules,我們可以理解爲 建立一個通用的可用被插入任何Web應用程序的HttpApplication事件鉤子。

使用HttpModule,是可複用的,不需要特定語應用程序代碼的,只需要web.config中的一個條目。

舉個例子:實現在每個頁面上添加了一句話:Add BeginRequest by MyHttpModule!

 

<system.web>

<httpModules>
<add name="MyHttpModule" type="aspDoNetTest.Handler.HttpModule"/>
</httpModules>

</system.web>

 

namespace aspDoNetTest.Handler
{
    public class HttpModule:IHttpModule
    {
        public void Dispose()
        {
             
        }
 
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }
        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;
            context.Response.Write("Add BeginRequest by MyHttpModule!");
        }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
    }
}

  再運行網站,不論請求任何一個頁面,都會在網站一開始請求的時候,再頁面上輸出 Add BeginRequest by MyHttpModule!

<location />

Location節點是用來指定子配置的資源。如果在asp.net應用程序中想對某個目錄做特殊處理,則可以用該節點來實現.舉個例子:

下面的代碼示例演示如何僅將指定頁的上載文件大小限制設置爲 128 KB。

<configuration>

<location path="UploadPage.aspx">

<httpRuntime maxRequestLength="128"/>

</location>

</configuration>

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