ASP.NET中的配置文件
在机房收费系统的时候曾经应用过配置文件,当时也就那么一用对配置文件了解的不是很透彻,下面就来总结一下有关配置文件的一些操作。
什么是配置文件
说白了就是用来保存项目中的一些配置信息,尤其是以后需要变更的配置信息。比如说连接数据库的操作,变更时,直接修改即可。ASP.NET网站IIS启动的时候会加载配置文件中的配置信息,然后进行缓存这些信息,在运行过程中会监视配置文件信息的变化情况,一旦发生变化会重新读取并缓存。
为什么要使用配置文件?
这就涉及到ASP.NET的运行机制了。
ASP.NET——DLL文件——JIT加工——本地机器代码——缓存
以上的过程就是ASP.NET页面在第一次请求的时候会被编译成DLL。文件,由JIT编程成本地代码执行,并将本地机器代码缓存。因此ASPX页面第一次打开的时候,会比较慢,以后执行的时候直接调用缓存即可。
正是由于这一点,.config文件逃过了这一劫,在发布Web应用程序的时候,web.config不被编译进去DLL文件。如果将来客户端发生变化,直接用记事本修改web.config文件,就可以重新运行。从这一点我们就可以看web.config文件保存变更配置信息的好处了。
在这里多提一点,从上面的ASP.NET执行机制中看出,浏览器端只会执行机器代码,所有的.ASPX文件多会被转换成机器代码,因此以后如果针对网站的性能优化的话,能尽量用静态网页,如HTML等,因为会提升网站性能,减少了编译的时间。
读取优先级(就近原则)现在当前页面寻找目录下的web.config文件,存在就停止
-
当前网站根目录中查找web.config文件,存在就停止
-
软件安装路径中查找web.config文件,存在就停止
Asp.Net 之 Web.config 配置文件详解
在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]
对于
string fileType=ConfigurationManager.AppSettings["FileType "];
[2]
以下就是一个
在代码中我们可以这么实例化数据库连接对象:
//读取web.config节点配置 string connectionString = ConfigurationManager.ConnectionStrings["AspNetStudyConnectionString1"].ConnectionString; //实例化SqlConnection对象 SqlConnection connection = new SqlConnection(connectionString);
这样做的好处是一旦开发时所用的数据库和部署时的数据库不一致,仅仅需要用记事本之类的文本编辑工具编辑connectionString属性的值就行了。
[2]
......
[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("故意抛出的异常。"); } }
先配置
在
在上面的配置中如果用户访问的页面不存在就会跳转到404.htm页面,如果用户没有权限访问请求的页面则会跳转到403.htm页面,403.htm和404.htm页面都是我们自己添加的页面,我们可以在页面中给出友好的错误提示。
[7]
查看machine.config文件同一目录下的web.config文件中的
...... ......
从上面的配置中可以看出,针对*.mdf、*.ldf文件的Get或者Post请求都会交给System.Web.HttpForbiddenHandler来处理,处理的结果就是用户不能查看或者下载相关的文件。如果我们某个文件夹下的文件或者某个类型的文件不允许用户下载,可以在节点中增加相应的子节点。
下面我们以一个例子来说明
上面的代码的作用是禁止访问IPData目录下的任何txt文件。
然后新建一个页面,在页面中添加一个超级链接,链接到该目录下IPData.txt文件,代码如下:
我们从上图中可以看到当
[8]
例如下面的配置控制用户最大能上传的文件为40M(40*1024K),最大超时时间为60秒,最大并发请求为100个。
[9]
属性名 说明
buffer 是否启用了 HTTP 响应缓冲。
enableViewStateMac 是否应该对页的视图状态运行计算机身份验证检查 (MAC),以放置用户篡改,默认为false,如果设置为true将会引起性能的降低。
validateRequest 是否验证用户输入中有跨站点脚本攻击和SQL注入式漏洞攻击,默认为true,如果出现匹配情况就会发 HttpRequestValidationException 异常。对于包含有在线文本编辑器页面一般自行验证用户输入而将此属性设为false。
下面就是一个配置节点的例子:
[10]
上面的节点配置是设置在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应用程序中的默认配置:
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" %>在部署后修改web.config的例子
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在使用时很灵活,可以自定义一些节点。所以这里只介绍一些比较常用的节点。