web.config配置(转载)

Asp.net中的web.config配置

By Bendon 20101123

目录

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实例。

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

时间: 2024-10-22 13:26:15

web.config配置(转载)的相关文章

[转载]通过configSource提高web.config配置灵活性

转载连接:http://www.cnblogs.com/Gyoung/p/3834876.html 通过configSource提高web.config配置灵活性 很多时候我们会有这样的情况,开发环境和测试环境中的配置文件是不一样的,最明显的就是数据库连接串,这样,每次我们发布一个测试版本,都要手动去修改一下配置文件,是不是很麻烦的说.其实利用web.config中的configSource属性,可以很方便的为我们指定外部配置为该节点的内容.这样我们在web.config中只需要指定该配置的co

Asp.net中的web.config配置

目录 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 1. . 3 2. . 5 3. . 5 4. . 6 . 11 四. 针对配置文件的一些编程操作... 11 1. 运行时进行配置文件的修改... 11 2. 配置节点的加密... 12 web.config是asp.net中保存配置信息(比如数据库连接字符串等)的重要文件.它是基于xml的文本文件方式放在Web应用程序的任何目录中,

asp.net中web.config配置节点大全详解【转】

web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web.config文件或者web.config文件中不存在该结点名,则查找它的上级目录,直到网站的根目录. (3)如果网站根目录下不存在web.config文件或者web.config文件中不存在该节点名则在%windir%"Microsoft.NET"Framework"v2.0.

使用Web.config配置网站信息

最近使用web.config来配置网站信息,在此做一个整体的介绍,方便自己查阅,也方便大家了. 一.ASP.NET配置文件 常用的ASP.NET配置文件包括machine.config与web.config ①machine.config:提供整个机器的默认配置,对该文件的修改影响该机器的所有站点 ②web.config:一般用于应用程序级别的配置文件,对其所作的修改不影响其他站点,也可用于站点下的子目录 二.自定义错误 [csharp] view plaincopyprint? <span>

Web.config配置数据库连接

web.config配置数据库连接 第一种:取连接字符串 string connString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["SqlConnStr"].ConnectionString; 或者 protected static string connectionString = ConfigurationManager.ConnectionStrings["SqlCon

Asp.net Web.Config - 配置元素 caching

记得之前在写缓存DEMO的时候,好像配置过这个元素,好像这个元素还有点常用. 一.caching元素列表 元素 说明 cache 定义全局应用程序缓存设置. 可选的元素. outputCache 指定应用程序范围的输出缓存设置. 可选的元素. outputCacheSettings 指定可以应用于应用程序中页的输出缓存设置. 可选的元素. sqlCacheDependency 为 ASP.NET 应用程序配置 SQL 缓存依赖项. 可选的元素. 1.cache 属性 特性 说明 disableM

web.config配置详细说明

(一).Web.Config是以XML文件规范存储,配置文件分为以下格式 1.配置节处理程序声明    特点:位于配置文件的顶部,包含在<configSections>标志中. 2.特定应用程序配置    特点: 位于<appSetting>中.可以定义应用程序的全局常量设置等信息. 3.配置节设置    特点: 位于<system.Web>节中,控制Asp.net运行时的行为. 4.配置节组    特点: 用<sectionGroup>标记,可以自定义分组

Asp.net Web.Config - 配置元素 httpCookies

1.属性 属性 说明 domain 可选的 String 属性. 设置 Cookie 域名. httpOnlyCookies 可选的 Boolean 属性. 脚本(javascript之类)能够访问 默认值为 false. requireSSL 可选的 Boolean 属性. 获取一个指示是否需要安全套接字层 (SSL) 通信的值. 默认值为 false. 该设置将被公开 requireSSL 配置的任何其他功能(如 authentication 的 forms 元素(ASP.NET 设置架构)

url传中文参数的时候,乱码,需要对web.config配置

1,form表单提交到某个具体页面 <form id="search_form" name="search_form" target="_blank" method="Post"> <input id="catid" name="catid" type="hidden" value="0"/> <input class