Asp.net中的web.config配置
Asp.net中的web.config配置
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>
以上所有具體操作可以看Demo實例。
下載demo
轉載于:https://www.cnblogs.com/gyweiUSTC/articles/1886443.html
總結
以上是生活随笔為你收集整理的Asp.net中的web.config配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】从3个科技公司里学到的57条经验
- 下一篇: 关于ASP.NET 中站点地图sitem