在asp.net中配置文件名一般默认是web.config。每个web.config文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中。在发布Web应用程序时web.config文件并不编译进dll文件中。如果将来客户端发生了变化,仅仅需要用记事本打开web.config文件编辑相关设置就可以重新正常使用,非常方便。
1、配置文件的查找优先级
[2]在这个文件夹下还有一个web.config文件,这个文件包含了asp.net网站的常用配置。下面是这个web.config文件的内容:
[3]asp.net网站IIS启动的时候会加载配置文件中的配置信息,然后缓存这些信息,这样就不必每次去读取配置信息。在运行过程中asp.net应用程序会监视配置文件的变化情况,一旦编辑了这些配置信息,就会重新读取这些配置信息并缓存。
[4]当我们要读取某个节点或者节点组信息时,是按照如下方式搜索的:
(1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找。
(2)如果当前页面所在目录下不存在web.config文件或者web.config文件中不存在该结点名,则查找它的上级目录,直到网站的根目录。
(3)如果网站根目录下不存在web.config文件或者web.config文件中不存在该节点名则在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config文件中查找。
(4)如果在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config文件中不存在相应结点,则在%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config文件中查找。
(5)如果仍然没有找到则返回null。
所以如果我们对某个网站或者某个文件夹有特定要求的配置,可以在相应的文件夹下创建一个web.config文件,覆盖掉上级文件夹中的web.config文件中的同名配置即可。这些配置信息的寻找只查找一次,以后便被缓存起来供后来的调用。在asp.net应用程序运行过程中,如果web.config文件发生更改就会导致相应的应用程序重新启动,这时存储在服务器内存中的用户会话信息就会丢失(如存储在内存中的Session)。一些软件(如杀毒软件)每次完成对web.config的访问时就会修改web.config的访问时间属性,也会导致asp.net应用程序的重启。
2、配置文件节点说明
web.config文件是一个XML文件,它的根结点是
[1]
<appSettings> <add key="ImageType" value=".jpg;.bmp;.gif;.png;.jpeg"/> <add key="FileType" value=".jpg;.bmp;.gif;.png;.jpeg;.pdf;.zip;.rar;.xls;.doc"/> appSettings>
对于
string fileType=ConfigurationManager.AppSettings["FileType "];
[2]
以下就是一个
<connectionStrings> <add name="AspNetStudyConnectionString1" connectionString="Data Source=(local);Initial Catalog=AspNetStudy;User ID=sa;Password=sa"/> connectionStrings>
在代码中我们可以这么实例化数据库连接对象:
//读取web.config节点配置 string connectionString = ConfigurationManager.ConnectionStrings["AspNetStudyConnectionString1"].ConnectionString; //实例化SqlConnection对象 SqlConnection connection = new SqlConnection(connectionString);
这样做的好处是一旦开发时所用的数据库和部署时的数据库不一致,仅仅需要用记事本之类的文本编辑工具编辑connectionString属性的值就行了。
[2]
<compilation debug="true"> ...... compilation>
[4]
Mode 验证模式说明
1)Windows 使用Windows身份验证,适用于域用户或者局域网用户。
2)Forms 使用表单验证,依靠网站开发人员进行身份验证。
3)Passport 使用微软提供的身份验证服务进行身份验证。
4)None 不进行任何身份验证。
[5]
Mode值说明
1)On 表示在本地和远程用户都会看到自定义错误信息。
2)Off 禁用自定义错误信息,本地和远程用户都会看到详细的错误信息。
3)RemoteOnly 表示本地用户将看到详细错误信息,而远程用户将会看到自定义错误信息。
这里有必要说明一下本地用户和远程用户的概念。当我们访问asp.net应用程时所使用的机器和发布asp.net应用程序所使用的机器为同一台机器时成为本地用户,反之则称之为远程用户。在开发调试阶段为了便于查找错误Mode属性建议设置为Off,而在部署阶段应将Mode属性设置为On或者RemoteOnly,以避免这些详细的错误信息暴露了程序代码细节从而引来黑客的入侵。
下面我们添加一个页面CustomErrorsDemo.aspx,在它的Page_Load事件里抛出一个异常,代码如下:
public partial class CustomErrorsDemo : System.Web.UI.Page
{
void Page_Load() void Page_Load(object sender, EventArgs e)
{
throw new Exception("故意抛出的异常。");
}
}
先配置
<customErrors mode="RemoteOnly"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> customErrors>
<customErrors mode="On" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="403.htm" /> <error statusCode="404" redirect="404.htm" /> customErrors>
在上面的配置中如果用户访问的页面不存在就会跳转到404.htm页面,如果用户没有权限访问请求的页面则会跳转到403.htm页面,403.htm和404.htm页面都是我们自己添加的页面,我们可以在页面中给出友好的错误提示。
[7]
查看machine.config文件同一目录下的web.config文件中的
<httpHandlers> ...... <add path="*.mdf" verb="*" type="System.Web.HttpForbiddenHandler" validate="true"/> <add path="*.ldf" verb="*" type="System.Web.HttpForbiddenHandler" validate="true"/> ...... httpHandlers>
从上面的配置中可以看出,针对*.mdf、*.ldf文件的Get或者Post请求都会交给System.Web.HttpForbiddenHandler来处理,处理的结果就是用户不能查看或者下载相关的文件。如果我们某个文件夹下的文件或者某个类型的文件不允许用户下载,可以在节点中增加相应的子节点。
下面我们以一个例子来说明
运行这个页面的效果如下:
<httpRuntime maxRequestLength="40960" executionTimeout="60" appRequestQueueLimit="100"/>
[9]
<pages buffer="true" enableViewStateMac="true" validateRequest="false"/>
[10]
<sessionState cookieless="false" mode="InProc" timeout="30" />
上面的节点配置是设置在asp.net应用程序中启用Cookie,并且指定会话状态模式为在进程中保存会话状态,同时还指定了会话超时为30分钟。
属性值 说明
Custom 使用自定义数据来存储会话状态数据。
InProc 默认值。由asp.net辅助进程来存储会话状态数据。
Off 禁用会话状态。
SQLServer 使用进程外SQL Server数据库保存会话状态数据。
StateServer 使用进程外 ASP.NET 状态服务存储状态信息。
一般默认情况下使用InProc模式来存储会话状态数据,这种模式的好处是存取速度快,缺点是比较占用内存,所以不宜在这种模式下存储大型的用户会话数据。
[11]
用于配置应用程序的全球化设置。此节点有几个比较重要的属性,分别如下:
属性名 说明
fileEncoding 可选属性。设置.aspx、.asmx 和 .asax 文件的存储编码。
requestEncoding 可选属性。设置客户端请求的编码,默认为UTF-8.
responseEncoding 可选属性。设置服务器端响应的编码,默认为UTF-8.
以下就是asp.net应用程序中的默认配置:
<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8"/>
3、配置文件的读写操作
虽然web.config文件是一个XML文件,但是由于权限的原因它在部署中不能像操作普通XML文件那样进行修改,在.net中提供了一个类用于对web.config进行修改。
下面是针对web.config修改通用类的代码:
using System; using System.Configuration; using System.Web; using System.Web.Configuration; ////// ConfigurationOperator 的摘要说明 /// public class ConfigurationOperator:IDisposable { private Configuration config; ConfigurationOperator():this(HttpContext.Current.Request.ApplicationPath) { } ConfigurationOperator(string path) { config = WebConfigurationManager.OpenWebConfiguration(path); } /// /// 设置应用程序配置节点,如果已经存在此节点,则会修改该节点的值,否则添加此节点 /// /// 节点名称 /// 节点值 void SetAppSetting(string key, string value) { AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings"); if (appSetting.Settings[key] == null)//如果不存在此节点,则添加 { appSetting.Settings.Add(key, value); } else//如果存在此节点,则修改 { appSetting.Settings[key].Value = value; } } /// /// 设置数据库连接字符串节点,如果不存在此节点,则会添加此节点及对应的值,存在则修改 /// /// 节点名称 /// 节点值 void SetConnectionString(string key, string connectionString) { ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings"); if (connectionSetting.ConnectionStrings[key] == null)//如果不存在此节点,则添加 { ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString); connectionSetting.ConnectionStrings.Add(connectionStringSettings); } else//如果存在此节点,则修改 { connectionSetting.ConnectionStrings[key].ConnectionString = connectionString; } } /// /// 保存所作的修改 /// void Save() { config.Save(); config = null; } void Dispose() { if (config != null) { config.Save(); } } }
把上面的代码存放到App_Code文件夹下,我们在项目中就可以直接使用了。
我们通过一个例子演示如果使用这个通用类对web.config进行设置。新建一个aspx页面,下面是前台代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ConfigModifyDemo.aspx.cs" Inherits="ConfigModifyDemo" %> DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>在部署后修改web.config的例子title> head> <body> <form id="form1" runat="server"> <div> <table border="0" cellpadding="0" cellspacing="0"> <tr><td>类型td><td>名称td><td>值td>tr> <tr><td> 程序配置td><td> <asp:TextBox ID="txtKey" runat="server">asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtKey" ErrorMessage="*" Display="Dynamic">asp:RequiredFieldValidator>td><td> <asp:TextBox ID="txtAppSetting" runat="server">asp:TextBox>td>tr> <tr><td> 数据库连接td><td> <asp:TextBox ID="txtConnectionName" runat="server">asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="*" ControlToValidate="txtConnectionName" Display="Dynamic">asp:RequiredFieldValidator>td><td style="height: 24px"> <asp:TextBox ID="txtConnectionString" runat="server">asp:TextBox>td>tr> <tr><td> <asp:Button ID="btnModify" runat="server" OnClick="btnModify_Click" Text="修改" />td><td>td><td>td>tr> table> div> form> body> html>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Configuration;//注意添加这个命名空间
public partial class ConfigModifyDemo : System.Web.UI.Page
{
void Page_Load(object sender, EventArgs e)
{
}
void btnModify_Click(object sender, EventArgs e)
{
string appSetting = txtAppSetting.Text;//appSetting子节点值
string connectionString = txtConnectionString.Text;//连接字符串
string key = txtKey.Text;//appSetting子节点Key
string connectionName = txtConnectionName.Text;//连接Name
ConfigurationOperator op = new ConfigurationOperator();
op.SetAppSetting(key, appSetting);
op.SetConnectionString(connectionName, connectionString);
op.Save();
} }
下面是运行界面:
由于Web.config在使用时很灵活,可以自定义一些节点。所以这里只介绍一些比较常用的节点。