Asp.net web.config 調用步驟

來源:互聯網
上載者:User

引自:http://www.cnblogs.com/killme/archive/2010/11/23/1885587.html

 

目錄

Asp.net中的web.config配置... 1

一、 設定檔儲存位置... 2

二、 設定檔載入順序... 2

三、 設定檔節點介紹... 3

1. <configSections>. 3

2. <appSettings>. 5

3. <connectionStrings>. 5

4. <system.web>. 6

<location>. 11

四、 針對設定檔的一些編程操作... 11

1. 運行時進行設定檔的修改... 11

2. 配置節點的加密... 12

web.config是asp.net中儲存配置資訊(比如資料庫連接字串等)的重要檔案。它是基於xml的文字檔方式放在Web應用程式的任何目錄中,並且預設不隨源檔案編譯到Dll中,而運行環境隨時監視著它是否有改變,一但有變動,系統會自動重新載入裡面的最新內容。

一、 設定檔儲存位置

.net的預設設定檔儲存在“windows目錄\Microsoft.NET\Framework\對應.net版本\config”檔案夾下面。不同的作業系統windows目錄不一樣,我們在命令列下輸入“echo %windir%”查看windows目錄所在的位置。

圖:web.config所在的目錄

Asp.net中有兩個非常重要的設定檔,分別是machine.config和web.config,它們都位於config檔案夾下面。這兩個檔案一般不需要我們手工是維護它,保持預設即可。但針對asp.net應用程式,它自身會有0個,1個或者多個web.config設定檔,多個設定檔會存在載入順序問題。下節會介紹。

注意,傳說中.net3.0和.net3.5隻是在.net2.0的基礎上擴充中,所以還是沒用的.net2.0的設定檔。它們連config這個目錄都沒有。

二、 設定檔載入順序

IIS在Asp.net網站啟動時,會載入設定檔中的配置資訊,然後緩衝這些資訊,不會每次要用都去讀取設定檔,只是IIS會隨時監視著這些檔案的變化,一量有變化,它會重新去讀取並緩衝配置資訊。

Asp.net網站運行時會按照以下方式載入設定檔中的節點資訊:

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

2) 如裡所在目錄不存在web.config配置或者設定檔裡沒有所需要的節點,則尋找它所在的上一級目錄的設定檔中的節點,直到網站根目錄。(問題:IIS6中的虛擬目錄算不算根目錄)

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

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

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

存在兩個問題

1) IIS6中的虛擬目錄算不算根目錄。

2) 在系統運行時,在一個原本沒有web.config的目錄中手工加上一個web.config,會不會自動載入。

三、 設定檔節點介紹

Web.config檔案是一個xml文字檔,它的根節點為<configuration>,該節點下包含常見的子節點有:<configSections>、<appSettings>、<connectionStrings>(儲存資料庫連接字串)、<location>和<system.web>。下面針對各節點配置進行介紹。

1. <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,首先我們在<configuration>節點下添加configSections。

<configuration>

<configSections>

<sectionGroup name="mySectionGroup">

<section name="mySection" requirePermission="true"

type="ConfigTest.SectionHandler.MySectionHandler,ConfigTest.SectionHandler" />

</sectionGroup>

</configSections>

<mySectionGroup>

<mySection>

<add key="key1" value="value1" />

<add key="key2" value="value2" />

<add key="key3" value="value3" />

<add key="key4" value="value4" />

<add key="key5" value="value5" />

</mySection>

</mySectionGroup>

<system.web>

<compilation debug="true" targetFramework="4.0" />

</system.web>

</configuration>

編寫自訂SectionHandler,我們為MySectionHandler返回一個Hashtable的資料。

namespace ConfigTest.SectionHandler

{

public class MySectionHandler : IConfigurationSectionHandler

{

public object Create(object parent, object configContext, System.Xml.XmlNode section)

{

Hashtable ht = new Hashtable();

foreach (XmlNode node in section.ChildNodes)

{

if (node.Name == "add")

{

ht.Add(node.Attributes["key"].Value, node.Attributes["value"].Value);

}

}

return ht;

}

}

}

在頁面中使用該Section,由ConfigurationManager.GetSection得到SectionHandler返回的Hashtable。注意參數結構。

protected void Page_Load(object sender, EventArgs e)

{

Hashtable ht = ConfigurationManager.GetSection("mySectionGroup/mySection") as Hashtable;

foreach (DictionaryEntry de in ht)

{

Response.Write(de.Key + " - " + de.Value + "<br>");

}

}

2. <appSettings>

該節點下主要用來儲存asp.net應用程式的一些配置資訊,也可以把資料庫連接字串也放在這裡,不過.net2.0提供了connectionStrings節點,所以資料庫連接字串還是不建議放在這裡,下面為一個圖片類型的執行個體。

<appSettings>

<!--圖片類型副檔名-->

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

</appSettings>

調用方法為:

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

3. <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;

4. <system.web>

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

Ø <customErrors>

<customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly">

<error statusCode="500" redirect="InternalError.htm"/>

</customErrors>

其中mode屬性有三種值,On/Off/RemoteOnly,預設為RemoteOnly。Error節點指定給定 HTTP 狀態碼的自訂錯誤頁面。

Ø <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 謂詞將傳入的請求映射到相應的處理常式。可以針對某個特定的目錄下指定的特殊檔案進行特殊處理。

下面我們來針對網站path目錄下的所有*.abc檔案夾來編寫自訂HttpHandle。

先添加到設定檔:

<httpHandlers>

<add path="path/*.abc" verb="*" type="ConfigTest.HttpHandler.AbcHttpHandler,ConfigTest.HttpHandler"/>

</httpHandlers>

編寫AbcHttpHandler:

namespace ConfigTest.HttpHandler

{

public class AbcHttpHandler : IHttpHandler, IRequiresSessionState

{

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

context.Response.Write("<h1><b>Hello HttpHandler</b></h1>");

context.Session["Test"] = "你在調用AbcHttpHandler容器中調用Session";

context.Response.Write(context.Session["Test"]);

}

}

}

系統調用結果:

圖:HttpHandler測試

我們還可以使用HttpHandlerFactory來進行handler自行切換。我們先定義兩個HttpHandler,分別是httpHandler1和httpHandler2。然後定義一個繼承於IHttpHandlerFactory的MyHandlerFactory來動態切換httpHandler,看代碼:

namespace ConfigTest.HttpHandler

{

public class MyHandlerFactory : IHttpHandlerFactory

{

public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)

{

if (url.IndexOf("1") > -1)

{

return new HttpHandler1();

}

else if (url.IndexOf("2") > -1)

{

return new HttpHandler2();

}

//返回預設Handler

return context.Handler;

}

public void ReleaseHandler(IHttpHandler handler)

{

// throw new NotImplementedException();

}

}

public class HttpHandler1 : IHttpHandler, IRequiresSessionState

{

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

context.Response.Write("<h1>HttpHandler1</h1>");

}

}

public class HttpHandler2 : IHttpHandler, IRequiresSessionState

{

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

context.Response.Write("<h1>HttpHandler2</h1>");

}

}

}

這裡只是測試,我們設定url中存在1這個字元時用HttpHandler1,存在2這個字元裡用HttpHandler2,否則返回系統預設的Handler。我們還得增加配置項:

<httpHandlers>

<add path="path/*.abc" verb="*" type="ConfigTest.HttpHandler.AbcHttpHandler,ConfigTest.HttpHandler"/>

<add path="HandlerFactory/*.*" verb="*" type="ConfigTest.HttpHandler.MyHandlerFactory,ConfigTest.HttpHandler"/>

</httpHandlers>

添加了一個httpHandler的配置項針對HandlerFactory目錄下所有檔案,我們運行測試一下:

圖:HandlerFactory測試

Ø <httpModules>

當請求在管道中傳遞時,HttpApplicaion對象中一系列的事件被觸發.我們已經看到這些事件在Global.asax中作為事件被發布.這種方法是特定於應用程式的,可能並不總是你想要的.如果你要建立一個通用的可用被插入任何Web應用程式的HttpApplication事件鉤子,你可用使用HttpModule,這是可複用的,不需要特定語應用程式代碼的,只需要web.config中的一個條目.

<httpModules>

<add name="MyHttpModule" type="ConfigTest.HttpModule.MyHttpModule,ConfigTest.HttpModule"/>

</httpModules>

和HttpHandler一樣,編寫繼承於IHttpModule的HttpModule:

namespace ConfigTest.HttpModule

{

public class MyHttpModule:IHttpModule

{

public void Dispose()

{

throw new NotImplementedException();

}

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!看結果:

圖:HttpModule測試

<location>

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

下面的程式碼範例示範如何僅將指定頁的上傳檔案大小限制設定為 128 KB。

<configuration>

<location path="UploadPage.aspx">

<httpRuntime maxRequestLength="128"/>

</location>

</configuration>

為指定目錄的圖片加浮水印:

<configuration>

<location path="images">

<system.web>

<httpHandlers>

<add verb="*" path="*.jpg" type="ImageHandler"/><!--圖片浮水印設定Handler-->

</httpHandlers>

</system.web>

</location>

</configuration>

四、 針對設定檔的一些編程操作1. 運行時進行設定檔的修改

這裡我們示範對appSettings節點進行修改:

public static void SetAppSetting(string key, string value)

{

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

AppSettingsSection appSetting = config.AppSettings;

//如果不存在則添加

if (appSetting.Settings[key] == null)

{

appSetting.Settings.Add(key, value);

}

else//否則修改

{

appSetting.Settings[key].Value = value;

}

config.Save(ConfigurationSaveMode.Full);

}

2. 配置節點的加密

有時候我們要對關鍵節點進行加密,.net給我們提供了加密的方法,下面我們示範對connectionStrings節點進行加密:

public static void ProtectSection()

{

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

ConfigurationSection section = config.Sections["connectionStrings"];

section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");

section.SectionInformation.ForceSave = true;

config.Save(ConfigurationSaveMode.Full);

}

這裡我們使用的是RsaProtectedConfigurationProvider,加密後connectionStrings節點為:

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">

<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"

xmlns="http://www.w3.org/2001/04/xmlenc#">

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />

<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />

<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">

<KeyName>Rsa Key</KeyName>

</KeyInfo>

<CipherData>

<CipherValue>Sg75NxcTUSMJwZG9ypLUZh9CeSe6Qa1APhxLpZ+EMNWH4lA9AhEEVbzxAgbWvjPGeJoQfONxpkhjeNVZUTrpm9T6dJMU2vQ6EPmXMMF7Lkng62nQ1LOK+gkTbJT8Z3VsprazFteQAwiBhL8GWB4M94kO7bx6P5Ifu6xgXPYdoEQ=</CipherValue>

</CipherData>

</EncryptedKey>

</KeyInfo>

<CipherData>

<CipherValue>zf47WegBTe8WdP7Pj8104IP1r0UuqNDYIyFppaN5e5TmtZihJQZZyNGW+NZiJqct+q+OdxPWEPRsi/F1tG/URiXypfNhWjZ7o0xps1LoPQgg8Y2mpQ0J3JVOZM8eNjX3jl5ylzPqUK7TsafyuYiht1ljjL2T+WwcQfqnVFlFsXQkQVWde0WMVeqjnSh09rPwJo4o2H9q9T6adaFDZ1WUzBR6eDRudrXsizI8HxdWuU7bD4z2WdQaO6vSUqK0kMep4zAGZOkbUlEjA800Fv0oTDH2fAgVHFXQxxl5EjQSvcjjZ7yViyjsjLJ5RMb1lxjdBQ0msrzQdELMNFVZ2jUbmwv7Pkvk+qcvIbHWTc+o0u4CGqLomsbMUWwZyqIeRXwYmir+CsjIJ4Cm+c6JOleGLsZSKaFRrFE8QjjkixSIvigVTHa8s58VVFKphZo7ZNm91b+8bucaanl8kaBkTsObUDdhfCk/J97gkyZ5BlHEAxnPAT47cj59P1SQqQoGm0gHujyNS4jTgS9JOdb4gBocPiVMBTzG4MhlWGensHLEuu5x9SqNCKYOGuk14Wo9vb4++JiRxCysDmKucGqQXLwTz0FY/IfA1Q16ns+l5MBFYvAoL8hBRHbGWgAodHHsj3UshlP+JI1+buEgxC8O1R0HPNQuIFXQhvGd2RkDQYhCgohyDlPayldl0EPJGYtOAer530s89t52+rU2XH4K84aXbmgClA5VuAzB</CipherValue>

</CipherData>

</EncryptedData>

</connectionStrings>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.