使用web.config中的configSections
之前的一篇文章“使用URLRewriter让你的站点牛逼起来- -!”中在讲述使用URLRewriter.dll的时候对web.config文件的配置中,第一步就提到对“configSections”节点的配置,在第二步中又根据第一步的配置来进行了进一步的节点配置——自定义节点的配置(“RewriterConfig”节点)。本文将通过实例简单描述一下configSections加点的使用方法^^
【使用section节点】
考虑一下这个需求,我们想要在web.config中使用自己定义的节点做一些配,例如把网站的超级管理员的登陆账号和密码给配置进去,然后在程序中读取它(当然一般我们不会这么做 - -!)。这样做的好处是我们可以使用自己定义的数据结构(xml格式),而配置信息的安全可以让web.config去管理。但是...,web.config是不可能随随便便让你定义节点的——可以试下自己定义个节点,编译的时候会报错。当然,有时候我们会自己创建个xml文件,那就另当别论了,不过这样做文件的安全性和数据的缓存就要要自己搞定了。
为了满足上面提的需求,我们可以使用configSections(在根节点“configuration”中)了,例如我们要配置一个这样的节点,名为“AdminInfo”,它有两个子节点,分别叫“Account”和“Password”,把他配置到根节点“configuration”中,如下:
1
2
3
4
5
6
|
< configuration > < AdminInfo > < Account >serafin</ Account > < Password >123456</ Password > </ AdminInfo > </ configuration > |
为了让这个自定义的节点为我们所用,现在在“configSections”节点中加入一个“section”节点,如下:
1
2
3
4
5
|
< configuration > < configSections > < section name = "AdminInfo" type = "ConfigSectionsTest.AdminInfoConfigurationSectionHandler" /> </ configSections > </ configuration > |
上面这个配置的意思是,声明一个自定义节点,名字叫“AdminInfo”,这个节点的读取要通过一个名为ConfigSectionsTest.AdminInfoConfigurationSectionHandler的类来读取,那么ConfigSectionsTest.AdminInfoConfigurationSectionHandler类如何定义呢?C#.NET中ConfigurationManager类的GetSection(string sectionName)静态方法就是用于读取这些自定义配置节点的,前提是要提供一个类用于实现IConfigurationSectionHandler接口的唯一方法Create(object parent, object configContext, System.Xml.XmlNodesection),在这个例子中用于实现该接口的类便是ConfigSectionsTest.AdminInfoConfigurationSectionHandler类,下面是这个类的定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
namespace ConfigSectionsTest { /// <summary> /// AdminInfoConfigurationSectionHandler /// </summary> public class AdminInfoConfigurationSectionHandler : IConfigurationSectionHandler { /// <summary> /// Create /// </summary> /// <param name="parent"></param> /// <param name="configContext"></param> /// <param name="section"></param> /// <returns></returns> public object Create( object parent, object configContext, System.Xml.XmlNode section) { return section; } } } |
实现了接口的方法,Create(object parent, object configContext, System.Xml.XmlNode section)中的最后一个参数便是我们的自定义节点了,是一个Xml节点对象,得到这个几点,我们便可以做我们想做的事情了(例如装成一个实体模型类对象,一个字典,哈希表之类的,只要你喜欢),因为返回的是一个object。
到这里,我们可以测试一下了,顺便创建个页面,在后台代码里面测试,例如点击个按钮然后读取这个节点显示在文本框中,如下:
1
2
3
4
5
6
|
protected void btnGetAdminInfo_Click( object sender, EventArgs e) { Object adminInfo = ConfigurationManager.GetSection( "AdminInfo" ); // 读取自定义节点 System.Xml.XmlNode node = adminInfo as System.Xml.XmlNode; // 装成XmlNode对象 this .txtInfo.Text = node.OuterXml; // 显示在文本框中 } |
【使用sectionGroup节点】
“configSections”中还有一个重要的节点,叫做“sectionGroup”,从名字中可以看出它作用,有了上面的理解作为基础,考虑一下下面这个自定义节点:
1
2
3
4
5
6
7
8
9
10
11
12
|
< configuration > < WebSiteInfo > < BasicInfo > < add key = "SiteName" value = "Tiu's Zone" /> < add key = "Version" value = "1.0" /> </ BasicInfo > < FileUpload > < add key = "FileUploadPath" value = "E:\\MyHomePage\\Web\\Upload\\" /> < add key = "FileUploadSizeMax" value = "2M" /> </ FileUpload > </ WebSiteInfo > </ configuration > |
为了使用“WebSiteInfo”这个自定义节点,我们需要在“configSections”中做这样的配置:
1
2
3
4
5
6
7
8
|
< configuration > < configSections > < sectionGroup name = "WebSiteInfo" > < section name = "BasicInfo" type = "ConfigSectionsTest.WebSiteInfoConfigurationSectionHandler" /> < section name = "FileUpload" type = "ConfigSectionsTest.WebSiteInfoConfigurationSectionHandler" /> </ sectionGroup > </ configSections > </ configuration > |
这里应该不用做太多说明了,通过上面的代码我们可以很清楚的理解sectionGroup的作用(ConfigSectionsTest.WebSiteInfoConfigurationSectionHandler类的实现和上面的ConfigSectionsTest.AdminInfoConfigurationSectionHandler完全一样,这里就不打出来鸟),读取节点的方法有点不同,主要是不同在对节点选择的路径上,直接看下面的代码就明白了:
1
2
3
4
5
6
|
protected void btnGetWebSiteInfo_Click( object sender, EventArgs e) { Object basicInfo = ConfigurationManager.GetSection( "WebSiteInfo/BasicInfo" ); // 读取自定义节点 System.Xml.XmlNode node = adminInfo as System.Xml.XmlNode; // 装成XmlNode对象 this .txtInfo.Text = node.OuterXml; // 显示在文本框中 } |
configSections节点的在开发中是很有用的,一个典型的情景就是文章开头提到的那个URLRewriter.dll组件,在增强应用程序的可移植性上,我们通常会需要一些自定义节点,上面那两个例子也是也说明了这一点(当然配置在appSetting节点中也是一种办法,但就没法灵活地定义自己的数据结构了)。文件说的很浅,要更好的使用这个配置,还是要看官方的文档,列举如下:
MSDN中对configSections 元素的说明:http://msdn.microsoft.com/zh-cn/library/ms228256(v=VS.80).aspx
MSDN中对IConfigurationSectionHandler接口的说明:http://msdn.microsoft.com/zh-cn/library/ms228056(VS.80).aspx
本文的例子在这里:有需要的话请 点击下载 ^—^