Web.config自定义节点configSections
1.为什么需要自定义节点
为了增加应用程序的可移植性,通常网站需要配置一些自定义的节点,例如:文件上传的路径等,再深入的应用,可以定义工厂方法需要创建的类。
2.configSections使用方法
configSections节点下定义自定义节点可以帮我们实现我们自己的节点。
首先定义自己的节点,定义方法如下:
<configSections>
<sectionGroup name="section group name">
<section name="section name" type="configuration section handler class" />
</sectionGroup>
</configSections>
定义自己的节点必须在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"];
在Default.aspx的Page_Load事件处理程序中添加如下代码:
string myWebSiteName = ((NameValueCollection)ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"))["name"];
Response.Write(myWebSiteName);
Ctrl+F5运行,可以看到页面输出了huchen's homepage
Web.config自定义节点configSections的更多相关文章
- 一个web.Config或app.Config自定义段configSections的示例
一个web.Config或app.Config自定义段configSections的示例 越来越觉得,直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml ...
- asp.net中web.config配置节点大全详解
最近网上找了一些关于Web.config配置节点的文章,发现很多都写的都比较零散,而且很少有说明各个配置节点的作用和用法.搜索了一下发现有一篇写的不错,这里引用一下 原文地址 http://www.c ...
- 通过Web.config中的configSections配置自己系统的全局常量
通过Web.config中的configSections配置自己系统的全局常量 随着系统的庞大,你的全局信息保存在appsitting里可能会比较乱,不如为模块写个自定义的全局常量吧 首先在Web.C ...
- WebConfig 自定义节点configSections配置信息
WebConfig 自定义节点configSections配置信息 示例: <configuration> <configSections> <!-- For ...
- 一个web.Config或app.Config自定义段configSections的示例--转
直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml配置文件,简洁方便得多.这两个配置文件不仅有常见的connectionStrings和appSetti ...
- asp.net中web.config配置节点大全详解【转】
web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web ...
- 【系统Configmachine.config与自己的应用程序的App.config/Web.Config配置节点重复】解决方法
自己的应用程序的App.config或Web.Config文件中与系统的C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Configmachine.co ...
- App.config自定义节点读取
<?xml version="1.0" encoding="utf-8"?> <configuration> <!--<ot ...
- 获取Web.Config中节点的值
读取webconfig里面的appSetting和connectionString <appSettings> <add key="SiteURL" value= ...
随机推荐
- C#基础---事件的使用
一:什么是事件 事件是可以被控件识别的操作,如按下确定按钮,选择某个单选按钮或者复选框.每一种控件有自己可以识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件,等等.事 ...
- 解决chrome在docky上的图标模糊或不能锁定的问题
1,终端执行以下命令:sudo nautilus2,打开usr/share/application,找到chrome的图标,右键找到属性,把“命令”里的内容换成/usr/bin/google-chro ...
- Hacker communities collection
Copy from E安全 Hack Forums: Hack Forums是目前最为理想的黑客技术学习根据地.该论坛不仅在设计上面向黑客群体,同时也适用于开发人员.博主.游戏开发者.程序员.图形设计 ...
- GTAC 2015 的视频和文档已经放出
视频见https://developers.google.com/google-test-automation-conference/2015/stream,文档见https://developers ...
- Mantis1.2.19 在Windows 平台上的安装配置详解
安装环境: WindowsXP 32 Apache2.2.22+PHP5.4.39+MySQL5.5.28 一.简介 MantisBT是由PHP开发的.基于WEB的缺陷跟踪系统,并采用开源数据库MyS ...
- redis存在大量脏页问题的追查记录
from:https://www.zybuluo.com/SailorXiao/note/136014 case现场 线上发现一台机器内存负载很重,top后发现一个redis进程占了大量的内存,TOP ...
- 在C#中将String转换成Enum:
一: 在C#中将String转换成Enum: object Enum.Parse(System.Type enumType, string value, bool ignoreCase); 所以,我 ...
- 十大经典排序算法总结——JavaScrip版
首先,对于评述算法优劣术语的说明: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:即排序后2个相等键值的顺序和排序之前它们的顺序相同 不稳定:如果a原本在b的前面,而a=b,排序之后a ...
- swift 集合类型(二)
说到swift的集合类型,就不得不谈到Dictionary.包含一个键值对组合的集合. var air = ["name":"warner","tit ...
- LeetCode 2. Add Two Numbers swift
// // main.swift // leetcode02 // // Created by GuoLa on 16/1/21. // Copyright © 2016年 GuoLa. All ri ...