您的位置:首页 > 其它

Web.config文件配置详解

2009-12-18 17:21 489 查看
一、认识Web.config文件
Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过VB。NET新建一个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"/>。
I、default language定义后台代码语言,可以选择c#和vb.net两种语言。
II、debug为true时,启动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>
I、mode:具有On、Off、RemoteOnly 3种状态。On表示始终显示自定义的信息;Off表示始终显示详细的asp.net错误信息;RemoteOnly表示只对不在本地Web服务器上运行的用户显示自定义信息。
II、defaultRedirect:用于出现错误时重定向的URL地址,是可选的。
III、statusCode:指明错误状态码,表明一种特定的出错状态。
IV、redirect:错误重定向的URL。
5、<globalization>节
格式:<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8"/>
I、requestEncoding:它用来检查每一个发来请求的编码。
II、responseEncoding:用于检查发回的响应内容编码。
III、fileEncoding:用于检查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"/>
I、mode:分为off、Inproc、StateServer、SqlServer几种状态。
Mode="InProc"存储在进程中特点:具有最佳的性能,速度最快,但不能跨多台服务器存储共享。mode = "StateServer" 存储在状态服务器中特点:当需要跨服务器维护用户会话信息时,使用此方法。但是信息存储在状态服务器上,一旦状态服务器出现故障,信息将丢失。mode="SqlServer"存储在sql server中特点:工作负载会变大,但信息不会丢失。
II、stateConnectionString:指定asp.net应用程序存储远程会话状态的服务器名,默认为本机。
III、sqlConnectionString:当用会话状态为数据库时,在这里设置连接字符串。
IV、Cookieless:设置为true时,表示不使用cookie会话状态来标识客户;否则,相反。
V、TimeOut:用来定义会话状态存储的时间,超过期限,将自动终止会话。
关于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> 节配合使用。验证模式有以下四种:
I、Windows:使用IIS验证方式,IIS根据应用程序的设置执行身份验证,(基本、简要或集成 Windows)。在 IIS 中必须禁用匿名访问。
II、Forms:使用基于窗体的验证方式,为用户提供一个输入凭据的自定义窗体(Web 页),然后在您的应用程序中验证他们的身份。用户凭据标记存储在Cookie中。
III、Passport:采用Passport cookie验证模式,"Passport"身份验证是通过Microsoft的集中身份验证服务执行的,它为成员站点提供单独登录和核心配置文件服务。
IV、None:不执行身份验证。
里面内嵌Forms节点的属性涵义:
I、Name:指定完成身份验证的Http cookie的名称。
II、LoginUrl:如果未通过验证或超时后重定向的页面URL,一般为登录页面,让用户重新登录。
III、Protection:指定 cookie数据的保护方式,可设置为:All、None、Encryption、Validation四种保护方式。其中,All表示加密数据,并进行有效性验证;Encryption表示对Cookie内容进行加密;validation表示对Cookie内容进行有效性验证;None表示不保护Cookie
IV、TimeOut:指定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 运行库设置,可以在计算机、站点、应用程序和子目录级别声明。
I、maxRequestLength:控制用户上传文件,单位为KB。
II、executionTimeout:最长时间,单位为S。
III、appRequestQueueLimit:最多请求数。
10、<pages>节
格式:<pages buffer="true" enableViewStateMac="true" validateRequest="false"/>
该节标识特定于页的配置设置(如是否启用会话状态、视图状态,是否检测用户的输入等),可以在计算机、站点、应用程序和子目录级别声明。
格式示例的意思为不检测用户在浏览器输入的内容中是否存在潜在的危险数据(注:该项默认是检测,如果你使用了不检测,一要对用户的输入进行编码或验证),在从客户端回发页时将检查加密的视图状态,以验证视图状态是否已在客户端被篡改。(注:该项默认是不验证)
11、<trace>节
格式:trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />
I、enabled:表示是否启用跟踪
II、requestLimit:表示指定在服务器上存储的跟踪请求的数目。
III、pageOutput="false"表示只能通过跟踪实用工具访问跟踪输出。
IV、traceMode="SortByTime"表示以处理跟踪的顺序来显示跟踪信息。
V、localOnly="true" 表示跟踪查看器 (trace.axd) 只用于宿主 Web 服务器。
四、自定义配置文件
为了增加应用程序的可移植性,通常网站需要配置一些自定义的节点,例如:文件上传的路径等,再深入的应用,可以定义工厂方法需要创建的类。
第一种方式是在<appSetting>节点中增加自定义配置,例如:
<appSettings>
<add key="Memcached.ServerList" value="192.168.1.6:11211,192.168.1.2:11211"/>
<add key="CSI.config" value="~/csi.config"/>
<add key="PackagePath" value="C:/Package"/>
<add key="fileConfig" value="manifest.config"/>
<add key="nodePath" value="/configuration/manifest/file"/>
<add key="fileAttribute" value="url"/>
</appSettings>


第三种方式是在configSections节点下定义自定义节点,这种方式是我们在用第一种方式不宜使用的情况下的最佳使用方式。
首先定义自己的节点,定义自己的节点必须在configSections节点中,定义方法如下:
<configSections>
<sectionGroup name="section group name">
<section name="section name" type="configuration section handler class" />
</sectionGroup>
</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 属性中指定的节或元素中的配置设置。
现在定义好了自己的节点,可以使用该节点了。使用方法如下:
<section group name>
<section name>
<add key="key1" value="value1" />
</section name>
</section group 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接口中,只有一个方法:

//创建配置节处理程序
Object Create (Object parent, Object configContext, XmlNode section)

返回值
创建的节处理程序对象。
这个类是干什么用的呢?让我们通过一个例子来看看。
首先,我们新建一个网站项目,并在web.config中加入以下节点:
<configSections>
<sectionGroup name="WebSiteInfo">
<section name="basicInfo" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
<section name="fileUpload" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
</sectionGroup>
</configSections>

<WebSiteInfo>
<basicInfo>
<add key="name" value="huchen's homepage"/>
<add key="version" value="1.0"/>
</basicInfo>
<fileUpload>
<add key="fileUploadPath" value="E://MyHomePage//Web//Upload//"/>
<add key="fileUploadSizeMax" value="2M"/>
</fileUpload>
</WebSiteInfo>

以上我们在WebSiteInfo节点下定义了两个节点basicInfo和fileUpload,并定义了节点处理程序类ConfigurationSectionTest.WebSiteInfoHandler,并且随后运用了我们定义的节点。
我们来看看节点处理程序ConfigurationSectionTest.WebSiteInfoHandler。
任意建立一个项目,新建一个类,或者直接在App_Code里新建一个类,如下:
并在Create函数中设置一个断点。
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
}
}

然后在Default.aspx的Page_Load事件处理程序中去访问我们自定义的节点,并在ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"); 这条语句上设置断点。
protected void Page_Load(object sender, EventArgs e)
{
Object o = ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");
}

好了,我们启动调试,看到程序首先执行到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中处理传进来的节点内容。
为了简单起见,我们引入两个类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"];
Response.Write(myWebSiteName);
Ctrl+F5运行,可以看到页面输出了huchen's homepage
以上关于自定义节点的第三种方法引自:http://www.cnblogs.com/huc87/archive/2009/05/06/1450981.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: