使用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”中,如下:

xml代码
1
2
3
4
5
6
<configuration>
  <AdminInfo>
    <Account>serafin</Account>
    <Password>123456</Password>
  </AdminInfo>
</configuration>


    为了让这个自定义的节点为我们所用,现在在“configSections”节点中加入一个“section”节点,如下:

xml代码
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类,下面是这个类的定义:

c#代码
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。
    到这里,我们可以测试一下了,顺便创建个页面,在后台代码里面测试,例如点击个按钮然后读取这个节点显示在文本框中,如下:

c#代码
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”,从名字中可以看出它作用,有了上面的理解作为基础,考虑一下下面这个自定义节点:

xml代码
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”中做这样的配置:

xml代码
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完全一样,这里就不打出来鸟),读取节点的方法有点不同,主要是不同在对节点选择的路径上,直接看下面的代码就明白了:

c#代码
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

    本文的例子在这里:有需要的话请 点击下载 ^—^

posted @ 2012-07-13 11:49  serafin  阅读(1449)  评论(1编辑  收藏  举报