C#的web.config文件详解

来源:互联网 发布:网络的图标 png格式 编辑:程序博客网 时间:2024/05/20 22:39

一、web.config查找的优先级

当我们要读取某个节点或者节点组信息时,按照如下方式搜索:

(1)在当前页面所在目录下查找web.config文件,存在则返回结果并停止查找;

(2)当前页面目录不存在web.config文件或者文件中不存在该节点,则查找上一级目录,只到搜索到网站的根目录;

(3)知道网站根目录也不存在文件或不存在该节点,就查找本机的.NET FrameWork中的web.config文件,一般在%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/web.config目录下;

(4)此文件也没有找到相关节点时,就查找%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config文件,如果还是没有找到则返回NULL;

(5)asp.net网站页面在读取配置信息后,会缓存这些信息,在运行过程中如果更改了配置文件,则会重新读取这些配置信息并缓存,会使application重启,从而存在内存中的用户会话信息如session就会丢失。

基于上述原理,可以在相应文件夹下建立web.config文件,这样就可以覆盖上级文件夹下的web.config文件中配置的相应参数,从而可以做到精确配置每个页面。

二、web.config文件配置节点

web.config是一个XML文件,根节点是<configuration>。

1、<appSettings>节点:主要用来存储asp.net程序的一些配置信息,比如上传文件的保存路径等。

<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>

2、<connectionStrings>节点:配置数据库连接字符串,可以在代码中动态获取节点的值实例化数据库连接对象,从而可以在部署后数据库连接信息发送变化时仅需用记事本打开此文件修改即可,因为web.config文件没有编译到网站程序中,修改后不会重新编译。

<connectionStrings>    <!--SQL Server数据库配置-->    <add name="AspNetStudyConnectionString1" connectionString="Data Source=(local);Initial Catalog=AspNetStudy;User ID=sa;Password=sa"/></connectionStrings>
3、<compilation>节点:配置所有编译设置,默认的debug属性为true,正式交付使用的时候应该设为false。

4、<authentication>节点:设置身份验证模式,Windows 使用Windows身份验证,适用于域用户或者局域网用户。Forms 使用表单验证,依靠网站开发人员进行身份验证。Passport 使用微软提供的身份验证服务进行身份验证。None 不进行任何身份验证。
5、<customErrors>节点:定义自定义错误信息,有Mode和defaultRedirect两个属性,defalutRedirect属性可选,表示发生错误重定向到的url。Mode有三个属性值。On 表示在本地和远程用户都会看到自定义错误信息。Off 禁用自定义错误信息,本地和远程用户都会看到详细的错误信息。RemoteOnly 表示本地用户将看到详细错误信息,而远程用户将会看到自定义错误信息。当我们访问asp.net应用程时所使用的机器和发布asp.net应用程序所使用的机器为同一台机器时成为本地用户,反之则称之为远程用户。在开发调试阶段为了便于查找错误Mode属性建议设置为Off,而在部署阶段应将Mode属性设置为On或者RemoteOnly,以避免这些详细的错误信息暴露了程序代码细节从而引来黑客的入侵。

<customErrors mode="RemoteOnly">     <error statusCode="403" redirect="NoAccess.htm" />     <error statusCode="404" redirect="FileNotFound.htm" /></customErrors>
6、<httpHandlers>节点:用于更具用户请求的URL和HTTP谓词将用户的请求交给相应的处理程序,可以针对某个特定目录下的指定特殊文件进行特殊处理。如果不允许某个文件夹下的文件或者某个类型的文件下载,可以增加如下节点:

<httpHandlers>      <add path="IPData/*.txt" verb="*" type="System.Web.HttpForbiddenHandler"/></httpHandlers>
7、<httpRuntime>节点:设置asp.net的http运行库。
<httpRuntime maxRequestLength="40960" executionTimeout="60" appRequestQueueLimit="100"/>

8、<pages>节点:对特定页面设置,主要有三个属性。buffer 是否启用了 HTTP 响应缓冲。enableViewStateMac 是否应该对页的视图状态运行计算机身份验证检查 (MAC),以放置用户篡改,默认为false,如果设置为true将会引起性能的降低。validateRequest 是否验证用户输入中有跨站点脚本攻击和SQL注入式漏洞攻击,默认为true,如果出现匹配情况就会发 HttpRequestValidationException 异常。对于包含有在线文本编辑器页面一般自行验证用户输入而将此属性设为false。

<pages buffer="true" enableViewStateMac="true" validateRequest="false"/>

8、<sessionState>节点:设置程序的回话状态,有cookieless、mode和timeout属性,其中mode有以下几个值:Custom 使用自定义数据来存储会话状态数据。
InProc 默认值。由asp.net辅助进程来存储会话状态数据。
Off 禁用会话状态。
SQLServer 使用进程外SQL Server数据库保存会话状态数据。
StateServer 使用进程外 ASP.NET 状态服务存储状态信息。
一般默认情况下使用InProc模式来存储会话状态数据,这种模式的好处是存取速度快,缺点是比较占用内存,所以不宜在这种模式下存储大型的用户会话数据。

9、<globalization>节点:配置应用程序的全球化设置。属性如下:

fileEncoding 可选属性。设置.aspx、.asmx 和 .asax 文件的存储编码。
requestEncoding 可选属性。设置客户端请求的编码,默认为UTF-8.
responseEncoding 可选属性。设置服务器端响应的编码,默认为UTF-8.

三、配置文件的操作

.NET提供了一个类用来对web.config进行操作,需要引用 using System.Web.Configuration。

1、读取

数据库配置信息读取

<connectionStrings>    <add name="AspNetStudyConnectionString1" connectionString="Data Source=(local);Initial Catalog=AspNetStudy;User ID=sa;Password=sa"/></connectionStrings>

读取方式:

string connectionString = ConfigurationManager.ConnectionStrings["AspNetStudyConnectionString1"].ConnectionString;

2、添加

Configuration config = WebConfigurationManager.OpenWebConfiguration("/WebConfigManager");        AppSettingsSection app = config.AppSettings;        app.Settings.Add("p", "p:\\");        config.Save(ConfigurationSaveMode.Modified);
3、修改
Configuration config = WebConfigurationManager.OpenWebConfiguration("/WebConfigManager");        AppSettingsSection app = config.AppSettings;        app.Settings["p"].Value = @"g:\";        config.Save(ConfigurationSaveMode.Modified);
4、删除

Configuration config = WebConfigurationManager.OpenWebConfiguration("/WebConfigManager");        AppSettingsSection app = config.AppSettings;        app.Settings.Remove("p");        config.Save(ConfigurationSaveMode.Modified);


针对web.config操作的通用类:

  1. using System;
  2. using System.Configuration;
  3. using System.Web;
  4. using System.Web.Configuration;
  5. /// <summary>
  6. /// ConfigurationOperator 的摘要说明
  7. /// </summary>
  8. public class ConfigurationOperator:IDisposable
  9. {
  10.     private Configuration config;
  11.  public ConfigurationOperator():this(HttpContext.Current.Request.ApplicationPath)
  12.  {
  13.         
  14.  }
  15.     public ConfigurationOperator(string path)
  16.     {
  17.         config = WebConfigurationManager.OpenWebConfiguration(path);
  18.     }
  19.     /// <summary> 
  20.     /// 设置应用程序配置节点,如果已经存在此节点,则会修改该节点的值,否则添加此节点
  21.     /// </summary> 
  22.     /// <param name="key">节点名称</param> 
  23.     /// <param name="value">节点值</param> 
  24.     public void SetAppSetting(string key, string value)
  25.     {
  26.         AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings");
  27.         if (appSetting.Settings[key] == null)//如果不存在此节点,则添加 
  28.         {
  29.             appSetting.Settings.Add(key, value);
  30.         }
  31.         else//如果存在此节点,则修改 
  32.         {
  33.             appSetting.Settings[key].Value = value;
  34.         }
  35.     }
  36.     /// <summary> 
  37.     /// 设置数据库连接字符串节点,如果不存在此节点,则会添加此节点及对应的值,存在则修改 
  38.     /// </summary> 
  39.     /// <param name="key">节点名称</param> 
  40.     /// <param name="value">节点值</param> 
  41.     public void SetConnectionString(string key, string connectionString)
  42.     {
  43.         ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
  44.         if (connectionSetting.ConnectionStrings[key] == null)//如果不存在此节点,则添加 
  45.         {
  46.             ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString);
  47.             connectionSetting.ConnectionStrings.Add(connectionStringSettings);
  48.         }
  49.         else//如果存在此节点,则修改 
  50.         {
  51.             connectionSetting.ConnectionStrings[key].ConnectionString = connectionString;
  52.         }
  53.     }
  54.     /// <summary> 
  55.     /// 保存所作的修改 
  56.     /// </summary> 
  57.     public void Save()
  58.     {
  59.         config.Save();
  60.         config = null;
  61.     }
  62.     public void Dispose()
  63.     {
  64.         if (config != null)
  65.         {
  66.             config.Save();
  67.         }
  68.     }
  69. }


参考资料:

1、http://blog.csdn.net/zhoufoxcn/article/details/3265141

2、http://www.cnblogs.com/xxtkong/archive/2011/10/14/2211793.html

3、http://blog.csdn.net/a4562834/article/details/7254343

原创粉丝点击