众所周知,Asp.Net程序的配置文件可以对整台机器、整个IIS服务器、单个Asp.Net应用程序、Asp.Net应用程序的子目录以及单个文件施加影响。在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG目录下有四个文件:machine.config、machine.config.comments、web.config和web.config.comments,其中的machine.config对整台机器施加影响,web.config对整个IIS服务器施加影响;而两个后缀名为.comments的文件是分别对这两个文件的详细描述,可以用记事本或IDE代开,这个有别于Asp.Net1.x版本,目的就是为了让machine.config和web.config这两个文件变得更加轻便,同时这两个文件里面除了注释而外就是machine.config和web.config文件相同的默认配置,如果由于我们更改这两个配置文件而导致错误的话,此文件就可以充当备份,我们可以在其中拷贝一份默认的代码来覆盖我们更改过的,就会回到默认配置,貌似很强大,呵呵~~。
配置文件的继承状态:子目录下网页文件的配置文件:子目录配置文件:网站配置文件:整个IIS服务器配置文件:整台机器配置文件。这里面的意思我就不多说了,用.Net的继承去理解一下就可以了。
配置节处理程序声明:配置节处理程序的声明在配置文件的configSections节点中,同时这个节点必须是Configuration的第一个元素。如下所示:
< configSections >
< section name = " appSettings " type = " System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " restartOnExternalChanges = " false " requirePermission = " false " />
< section name = " connectionStrings " type = " System.Configuration.ConnectionStringsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " requirePermission = " false " />
< section name = " mscorlib " type = " System.Configuration.IgnoreSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " allowLocation = " false " />
< section name = " runtime " type = " System.Configuration.IgnoreSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " allowLocation = " false " />
</ configSections >
< configuration >
< namespaces >
< add namespace = " System " />
< add namespace = " System.Collections " />
< add namespace = " System.Collections.Specialized " />
< add namespace = " System.Configuration " />
< add namespace = " System.Text " />
< add namespace = " System.Text.RegularExpressions " />
< add namespace = " System.Web " />
< add namespace = " System.Web.Caching " />
< add namespace = " System.Web.SessionState " />
< add namespace = " System.Web.Security " />
< add namespace = " System.Web.Profile " />
< add namespace = " System.Web.UI " />
< add namespace = " System.Web.UI.WebControls " />
< add namespace = " System.Web.UI.WebControls.WebParts " />
< add namespace = " System.Web.UI.HtmlControls " />
</ namespaces >
< controls >
< add tagPrefix = " asp " namespace = " System.Web.UI.WebControls.WebParts " assembly = " System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a " />
</ controls >
</ pages >
网站管理工具:此功能允许我们使用浏览器管理网站配置文件,在本地和远程都可操作,不需要本机的管理员权限即可操作,但是要有网站的管理权限。打开方式一:解决方案资源管理器>>,打开方式二:"项目"菜单>>Asp.Net配置。此方式配置的内容要比MMC下面少,原因是考虑到了安全因素,但大多数常见的节点都可以通过它来设置。这个主要是用来弥补MMC下需要本机管理员的一种补充方案。
Asp.Net2.0配置API:所有配置相关的类是存在于System.Configuration命名空间中的;所有的配置包括machine.config和web.config都是用System.Configuration.Configuration类下面的方法来操作的;所有的web.config相关的类是存在于System.Web.Configuration命名空间的;所有的web.config都是用System.Web.Configuration.WebConfigurationManager类下的方法来处理的。以下为各种情形下的程序示例:
1.在上级web.config中指定某个子目录或单个文件的配置文件
Asp.Net应用程序web.config如下,有两层意思:第一个Location节点表示禁止所有用户访问SubFolder目录下的文件,第二个Location节点表示允许所有用户访问SubFolder目录下的validatorUserIsNoLogin.aspx文件。两个合起来的意思就是允许用户只能访问SubFolder目录下的validatorUserIsNoLogin.aspx文件。
< configuration >
< appSettings />
< connectionStrings />
< system.web >
<!--
设置 compilation debug = " true " 可将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true 。
-->
< compilation debug = " true " >
</ compilation >
<!--
通过 < authentication > 节可以配置 ASP.NET 用来
识别进入用户的
安全身份验证模式。
-->
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 < customErrors > 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
< customErrors mode = " RemoteOnly " defaultRedirect = " GenericErrorPage.htm " >
< error statusCode = " 403 " redirect = " NoAccess.htm " />
< error statusCode = " 404 " redirect = " FileNotFound.htm " />
</ customErrors >
-->
</ system.web >
< location path = " SubFolder " allowOverride = " true " >
< system.web >
< authorization >
< deny users = " * " />
</ authorization >
</ system.web >
</ location >
< location path = " SubFolder/validatorUserIsNoLogin.aspx " >
< system.web >
< authorization >
< allow users = " * " />
</ authorization >
</ system.web >
</ location >
</ configuration >
上图中的allowOverride="true"表示允许子目录重写此此节点,否则不能重写。在SubFolder目录中的web.config中重写如下:
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站” -> “Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
\Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
< configuration >
< appSettings />
< connectionStrings />
< system.web >
< authorization >
< allow users = " * " />
</ authorization >
</ system.web >
</ configuration >
由于上级配置文件中的节点被子目录配置文件重写,重写后的效果是允许所有用户访问SubFolder目录下的页面。
注意:如果将上级目录中第二个Location节点改为如下:
< system.web >
< authorization >
< deny users = " * " />
</ authorization >
</ system.web >
</ location >
那么意思就是允许所有用户访问SubFolder目录中除validatorUserIsNoLogin.aspx而外的所有文件。即就是页面配置文件拥有最高优先权。
2.在子目录web.config中重写上级web.config相应节点
Asp.Net应用程序web.config如下,意思是当前网站应用程序禁止一切用户访问
< configuration >
< appSettings />
< connectionStrings />
< system.web >
< authorization >
< deny users = " * " />
</ authorization >
</ system.web >
</ configuration >
在目录SubFolder下的web.config如下,配置后当前应用程序只有SubFolder下的页面可允许访问。
< configuration >
< appSettings />
< connectionStrings />
< system.web >
< authorization >
< allow users = " * " />
</ authorization >
</ system.web >
</ configuration >
3.读取当前应用程序的继承配置
{
System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration( " /Demo0 " );
config.SaveAs( @" F:\Website\MyApp.web.config " , System.Configuration.ConfigurationSaveMode.Full, true );
}
4.读取任一节点的值
读取配置文件中System.Web节点下compilation子节点Debug属性值。
{
string path = " /Demo0 " ;
// 打开指定虚拟路径下的web.config文件以允许读写操作
Configuration config = WebConfigurationManager.OpenWebConfiguration(path);
// 获取要操作的配置节,在这里我们获取的是system.web下的compilation节点
CompilationSection section = config.GetSection( " system.web/compilation " ) as CompilationSection;
System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
strBuilder.Append( " debug: " );
// section.Debug.ToString()用于获取或设置Debug属性值
strBuilder.Append(section.Debug.ToString());
this .Label1.Text = strBuilder.ToString();
}
5.Asp.Net1.x下使用IConfigurationSectionHanddler创建自定义配置节处理程序
首先,在web.config中声明配置节处理程序
< configSections >
< section name = " customConnStr " type = " MyConfigSectionHanddler.CustomConnStr,MyConfigSectionHanddler,Version=2.0.0.0, Culture=neutral, PublicKeyToken=null " allowDefinition = " Everywhere " allowLocation = " true " />
</ configSections >
< customConnStr >
< add key = " Ext_SvrName " value = " jewleo\SQL2005 " />
< add key = " Ext_DBName " value = " aspnetdb " />
< add key = " Ext_UID " value = " sa " />
< add key = " Ext_Pwd " value = " sa " />
</ customConnStr >
< appSettings />
< connectionStrings />
< system.web >
<!--
设置 compilation debug = " true " 可将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true 。
-->
< compilation debug = " true " >
</ compilation >
<!--
通过 < authentication > 节可以配置 ASP.NET 用来
识别进入用户的
安全身份验证模式。
-->
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 < customErrors > 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
< customErrors mode = " RemoteOnly " defaultRedirect = " GenericErrorPage.htm " >
< error statusCode = " 403 " redirect = " NoAccess.htm " />
< error statusCode = " 404 " redirect = " FileNotFound.htm " />
</ customErrors >
-->
</ system.web >
</ configuration >
定义配置节处理程序,在Asp.Net1.x中必须继承自IConfigurationSectionHanddler接口
using System.Collections;
using System.Text;
using System.Collections.Specialized;
using System.Configuration;
using System.Xml;
namespace MyConfigSectionHanddler
{
public class CustomConnStr : IConfigurationSectionHandler
{
private const String EXT_SVRNAME = " Ext_SvrName " ;
private const String EXT_DBNAME = " Ext_DBName " ;
private const String EXT_UID = " Ext_UID " ;
private const String EXT_PWD = " Ext_Pwd " ;
private static String mstrExt_SvrName;
private static String mstrExt_DBName;
private static String mstrEXT_UID;
private static String mstrEXT_PWD;
private static string mstrAppRoot;
public object Create( object parent, object configContext, XmlNode section)
{
NameValueCollection settings;
try
{
NameValueSectionHandler baseHanddler = new NameValueSectionHandler();
settings = baseHanddler.Create(parent, configContext, section) as NameValueCollection;
}
catch
{
settings = null ;
}
if (settings == null )
{
}
else
{
mstrExt_SvrName = ReadSetting(settings, EXT_SVRNAME, string .Empty);
mstrExt_DBName = ReadSetting(settings, EXT_DBNAME, string .Empty);
mstrEXT_UID = ReadSetting(settings, EXT_UID, string .Empty);
mstrEXT_PWD = ReadSetting(settings, EXT_PWD, string .Empty);
}
return null ;
}
/// <summary>
/// 检索当前应用程序的名为customConnStr的配置节
/// </summary>
/// <param name="strAppPath"> 应用程序路径 </param>
public static void OnApplicationStart(String strAppPath)
{
mstrAppRoot = strAppPath;
System.Configuration.ConfigurationManager.GetSection( " customConnStr " );
}
/// <summary>
/// 根据NameValueCollection对象中的key获取value
/// </summary>
/// <param name="settings"> NameValueCollection对象 </param>
/// <param name="key"> NameValueCollection对象中的key </param>
/// <param name="defaultValue"> 默认值 </param>
/// <returns> String类型 获取到的值 </returns>
public static String ReadSetting(NameValueCollection settings, String key, string defaultValue)
{
try
{
object setting = settings[key];
return (setting == null ) ? defaultValue : (String)setting;
}
catch
{
return defaultValue;
}
}
public static string ConnectionStringExt
{
get
{
string connectStr;
connectStr = " servername= " + mstrExt_SvrName + " ;database= " + mstrExt_DBName + " ;uid= " + mstrEXT_UID + " ;pwd= " + mstrEXT_PWD;
return connectStr;
}
}
}
}
下面是测试程序
首先在Global.asax中添加如下代码
{
MyConfigSectionHanddler.CustomConnStr.OnApplicationStart( " /Demo0 " );
}
然后如下用主程序调用
{
Label1.Text = MyConfigSectionHanddler.CustomConnStr.ConnectionStringExt;
}
6.Asp.Net2.0使用ConfigurationSection创建自定义配置节处理程序,这个新增的特性创建配置节处理程序很方便,不像上面那样,有太多的逻辑来写,废话不说了,代码来了。
首先,在web.config中声明配置节处理程序
< configuration >
< configSections >
< section name = " customSectionAttribute " type = " MyConfigSectionHanddler.CustomSectionAttribute,MyConfigSectionHanddler,Version=2.0.0.0,Culture=neutral,PublicKeyToken=null " allowDefinition = " Everywhere " allowLocation = " true " />
</ configSections >
< customSectionAttribute myAttrib1 = " Clowns " >
< myChildSection myChildAttrib1 = " Zippytest " myChildAttrib2 = " Michael Zawondy test " />
</ customSectionAttribute >
< appSettings />
< connectionStrings />
< system.web >
<!--
设置 compilation debug = " true " 可将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true 。
-->
< compilation debug = " true " >
</ compilation >
<!--
通过 < authentication > 节可以配置 ASP.NET 用来
识别进入用户的
安全身份验证模式。
-->
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 < customErrors > 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
< customErrors mode = " RemoteOnly " defaultRedirect = " GenericErrorPage.htm " >
< error statusCode = " 403 " redirect = " NoAccess.htm " />
< error statusCode = " 404 " redirect = " FileNotFound.htm " />
</ customErrors >
-->
</ system.web >
</ configuration >
其次,定义配置节处理程序,其实当中最重要的就是Attribute的使用
using System.Configuration;
namespace MyConfigSectionHanddler
{
public class CustomSectionAttribute : ConfigurationSection
{
public CustomSectionAttribute()
{
}
public CustomSectionAttribute(String attribVal)
{
MyAttrib1 = attribVal;
}
[ConfigurationProperty( " myAttrib1 " , DefaultValue = " Clowns " , IsRequired = true )]
[StringValidator(InvalidCharacters = " =!@#$%^&*?/\\ " ,MaxLength = 60 ,MinLength = 1 )]
public String MyAttrib1
{
get {
return (String) this [ " myAttrib1 " ];
}
set {
this [ " myAttrib1 " ] = value;
}
}
[ConfigurationProperty( " myChildSection " )]
public MyChildConfigElement MyChildSection
{
get {
return (MyChildConfigElement) this [ " myChildSection " ];
}
set
{
this [ " myChildSection " ] = value;
}
}
public class MyChildConfigElement : ConfigurationElement
{
public MyChildConfigElement()
{
}
public MyChildConfigElement(String a1,String a2)
{
MyChildAttrib1 = a1;
MyChildAttrib2 = a2;
}
[ConfigurationProperty( " myChildAttrib1 " , DefaultValue = " Zippytest " , IsRequired = true )]
[StringValidator(InvalidCharacters = " =!@#$%^&*?/\\ " , MaxLength = 60 , MinLength = 1 )]
public String MyChildAttrib1
{
get
{
return (String) this [ " myChildAttrib1 " ];
}
set
{
this [ " myChildAttrib1 " ] = value;
}
}
[ConfigurationProperty( " myChildAttrib2 " , DefaultValue = " Michael Zawondy test " , IsRequired = true )]
[StringValidator(InvalidCharacters = " =!@#$%^&*?/\\ " , MaxLength = 60 , MinLength = 1 )]
public String MyChildAttrib2
{
get
{
return (String) this [ " myChildAttrib2 " ];
}
set
{
this [ " myChildAttrib2 " ] = value;
}
}
}
}
}
{
MyConfigSectionHanddler.CustomSectionAttribute config =
(MyConfigSectionHanddler.CustomSectionAttribute)System.Configuration.ConfigurationManager.GetSection(
" customSectionAttribute " );
StringBuilder sb = new StringBuilder();
sb.Append( " <h2>Attributes in the myCustomSection Element:</h2> " );
sb.AppendFormat( " myAttrib1 = {0}<br/> " , config.MyAttrib1.ToString());
sb.Append( " <h2>Attributes in the myChildSection Element:</h2> " );
sb.AppendFormat( " myChildAttrib1 = {0}<br/> " , config.MyChildSection.MyChildAttrib1.ToString());
sb.AppendFormat( " myChildAttrib2 = {0}<br/> " , config.MyChildSection.MyChildAttrib2.ToString());
Label1.Text = sb.ToString();
Label1.Visible = true ;
}