Web.config自定义节点configSections (我还没有弄懂怎么回事.)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值