`

在Web.config配置文件中自定义配置节点(转载)

阅读更多

摘要:

    大部分ASP.NET应用程序都包含很多个配置信息,比较常见的有连接字符串配置ConnectionString;当我们需要用到Login控件自动发送Email时,我们就要配置Email服务器节点;还有很多如Page节点可以引入程序集和命名空间等等。根据我的经验很多网站的初始化信息(默认设置)很多都会保存在数据库中,也有很多保存在配置文件中,他们各有各的优点。我们可以在web.config中定义我们自己的节点,然后再读取或更新自定义配置文件,当然我们也可以自定义一个配置文件并将其解析读取。本文主要讲的是利用ASP.NET给我提供的一些APIs在Web.config中自定义配置节点。

     为了能够更好的说明,我们先定义一个配置节点<nexplus></nexplus>,它有一个属性网站名称webName。有自己的Providers,以及一个States节点,配置如下:

<!----> 1 <NExplus webName="Custom configuration section in web.config">
 2         <providers>
 3             <add name="CommonProvider" type="NExplus.Data.SqlCommonProvider,NExplus.Data" connectionStringName="SqlServer"/>
 4         <providers>
 5         <states>
 6             <add name="厦门" code="0592"/>
 7             <add name="福州" code="0591"/>
 8             <add name="三明" code="0598"/>
 9         <states>
10 <NExplus>
11 

读取方法:

    配置文件中就是XML文件,如果是我们自定义地配置文件可以用DotNet读取XML的方法通过序列化和反序列化等来读取,在以后的版本中还可以通过XLinQ来读取。而在web.config文件中主要可以通过两种方法来读取配置文件,当然首先要做的是在<configsections></configsections>节点中配置关联的操作类及其程序集

1.定义一个类,实现System.Configuration.IConfigurationSectionHandler接口,这个方法很简单就是实现一个方法,这里就不再多说了。

2.在ASP.NET2.0中我们已经能够很简单的操作配置文件中的节点了,他为我们提供了一系列的类如我们定义一个类只要继承ConfigurationSection就可以定义我们的节点了,子节点可以继承ConfigurationElement等等。只要在属性上标注ConfigurationProperty attribute即可。定义配置类:

<!----> 1 public class CustomConfiguration : ConfigurationSection
 2 {
 3    [ConfigurationProperty ("webName", DefaultValue="Custom configuration section in web.config ", IsRequired=false)]
 4    public string WebName
 5    {
 6       get
 7       {
 8          return this["webName"as string;
 9       }
10    }
11 }
12 

 

   以上只列出了读取属性的方法,每一个用ConfigurationProperty attribute标注的属性就能够自动从web.config文件中反序列过来实例化当前类。下面我们来看看ConfigurationProperty attribute的每一个属性的作用。

--Name:配置节点名称或属性名称,要求唯一标识。

--DefaultValue:配置文件中每个属性的默认值,如果配置文件中没有定义此属性则在代码中调用此属性时,将取得这个值。

--IsRequired:标明当前属性是否必须,如果为true而配置文件中并没有定义此属性,当访问此网站时将抛出错误。

   我们可以通过System.Web.Configuration.WebConfigurationManager来获取此节点的实例,代码如下:

 

<!---->1 public static CumstomConfiguration GetConfig(){
2    return WebConfigurationManager.GetSection(“NExplus”) as CumstomConfiguration;
3 }
4 

 

基于集合配置属性的读取:

    很多时候我们需要得到一个集合的所有配置,最常见的莫过于providers,系统已经为我们准备好了ProviderCollection,我们只要直接引用就好了。但是如果遇到向上面定义的<states></states>节点的读取就需要我们自己来写一个集合,这个集合要继承ConfigurationElementCollection类,而当前实体类需继承ConfigurationElement类。为了读取<states></states>节点我们定义一个实体类如下:

 

 1 public class ConfigurationState : ConfigurationElement
 2 {
 3    [ConfigurationProperty("name", IsRequired=true)]
 4    public string Name
 5    {
 6       get
 7       {
 8          return this["name"as string;
 9       }
10    }
11 
12    [ConfigurationProperty("code", IsRequired=false)]
13     public string Code
14    {
15       get
16       {
17          return this["code"as string;
18       }
19    }
20 }
21 

 

   有了实体类我们当然要写一个集合类,代码如下:

 

<!----> 1 public class ConfigurationStateCollection : ConfigurationElementCollection
 2 {
 3    public ConfigurationState this[int index]
 4    {
 5       get
 6       {
 7          return base.BaseGet(index) as ConfigurationState;
 8       }
 9       set
10       {
11          if (base.BaseGet(index) != null)
12          {
13             base.BaseRemoveAt(index);
14          }
15          this.BaseAdd(index, value);
16       }
17    }
18 
19    protected override ConfigurationElement CreateNewElement()
20    {
21       return new ConfigurationState();
22    }
23 
24    protected override object GetElementKey(ConfigurationElement element)
25    {
26       return ((ConfigurationState)element).Name;
27    } 
28 }
29 

 

      我们需要对当前集合进行索引读取或设置,重写了两个方法,从而能够获取当前实例和获取当前配置节点的名称等,当然最后一步就是要将它加入到配置类中(次配置类一定要在configSettings节点中标注)。代码如下:

 

<!----> 1 public class CustomConfiguration : ConfigurationSection
 2 {
 3     
 4 
 5    [ConfigurationProperty("states")]
 6    public ConfigurationStateCollection CustomStates
 7    {
 8       get 
 9       { 
10          return this["states"as ConfigurationStateCollection; 
11       }
12    }
13 }
14 

 

总结:

    这篇文章已经不是什么新鲜的事了,由于最近我也在做这个事情,其中值得说明的是在providers的应用,我们可以通过ProvidersCollection来读取其集合,通过ProvidersHelper来实例化当前provider,如果在你的数据库提供者抽象类中继承ProviderBase类万事就OK了。如果考虑到性能问题可以借助Cache来提高一些性能,最后还是希望能给更多人带来一点帮助,分享一下我的经验。

分享到:
评论

相关推荐

    在web.config和app.config文件中增加自定义配置节点的方法

    本篇文章主要是对在web.config和app.config文件中增加自定义配置节点的方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    ASP.NET web.config 配置节点详解

     (3)如果网站根目录下不存在web.config文件或者web.config文件中不存在该节点名则在%windir%”Microsoft.NET”Framework”v2.0.50727″CONFIG”web.config文件中查找。  (4) 如果在%windir%”Micros

    c#读取自定义配置文件

    在开发Asp.net站点的时候,我们会遇到很多的配置参数:网站名称,上传图片后缀,上传文件后缀,关键字过滤,数据库连接字串等等,这些内容如果比较少的话,直接配置到Web.config文件中,借由.NET提供的操作类,将会非常方便的...

    详解在.net中读写config文件的各种方法

    在config文件中,我将主要演示如何创建自己的自定义的配置节点,而不是介绍如何使用appSetting 。 请明:本文所说的config文件特指app.config或者web.config,而不是一般的XML文件。 在这类配置文件中

    spring.net中文手册在线版

    在Web应用程序中进行图像本地化 19.6.5.全局资源 19.6.6.用户语言文化管理 19.6.6.1. DefaultWebCultureResolver 19.6.6.2. RequestCultureResolver 19.6.6.3. SessionCultureResolver 19.6.6.4. ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    16.2.7 通过配置文件来应用主题 16.2.8 动态应用主题 16.3 标准化网站布局 16.4 母版页基础 16.4.1 简单的母版页 16.4.2 简单的内容页 16.4.3 默认内容 16.4.4 具有表格和CSS布局的母版页 16.4.5 ...

    asp.net专家疑难解答200问源码

    157.如何使用Web.config配置数据库连接字符串 161.如何编写访问数据库的通用代码 162.如何在SQL Server数据库中编程获取用户表的数目和名称 163.如何获取SQL Server服务器端所有数据库列表 164.如何保存图片文件...

    ASP.NET4高级程序设计(第4版) 3/3

    16.2.7 通过配置文件来应用主题 549 16.2.8 动态应用主题 550 16.3 标准化网站布局 551 16.4 母版页基础 552 16.4.1 简单的母版页 552 16.4.2 简单的内容页 554 16.4.3 默认内容 556 16.4.4 具有表格...

    asp.net专家疑难解答200问

    如何使用Web.config配置数据库连接字符串 161.如何编写访问数据库的通用代码 162.如何在SQL Server数据库中编程获取用户表的数目和名称 163.如何获取SQL Server服务器端所有数据库列表 164.如何保存...

    ssh(structs,spring,hibernate)框架中的上传下载

    WEB-INF下的applicationContext.xml为Spring的配置文件,struts-config.xml为Struts的配置文件,file-upload.jsp为文件上传页面,file-list.jsp为文件列表页面。  本文后面的章节将从数据持久层->业务层->Web层的...

    asp.net博客系统

    然后修改程序web.config的数据库连接字符串,有两个地方,一个在节点内,一个在节点内,这个就不多说了 【管理员帐户配置】:默认帐号/密码:51aspx/51aspx 也可以运行web/tools下的Encrypt.aspx,输入自定义...

    ExtAspNet_v2.3.2_dll

    -ExtAspNet支持多语言(en,zh_CN,zh_TW),可以在Web.config中修改。 -将所有的示例转化为英语版本。 -修正Tree控件的一个BUG(定义Mappings属性时)。 +PageManager.Instance应该存在于HttpContext.Current,而...

    仿淘宝网程序无错版

    然后:把根目录的web.config配置(可以不做) [注:将下面代码拷入web.config中的&lt;system.web&gt;&lt;/system.web&gt;节中] &lt;add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" /&gt; 其次:把BBS里Bin...

    DTcms_50_sql_src最新旗舰版带手机和微信公众号设置

    一、系统描述 1、大数据 云存储 DTcms 5.0...3、找到网站目录下的“Web.config”文件,找到“connectionStrings”节点,将其更改为: 您的数据库IP;uid=数据库登录用户名;pwd=数据库登录密码;database=数据库名称;"/&gt;

    PlugNT CMS v3.5正式版源码

    项目介绍: PlugNT CMS,一款免费开源ASP.NET内容管理系统,PlugNT系统组成部分之一,系统采用ASP.NET(C#) + jQuery技术,是一个功能强大、操作人性...3 数据库链接需要修改App_Data文件夹中site.config配置文件db节点

    C#开发经验技巧宝典

    10.5 Web.Config文件的配置 237 0431 通过Encoding的设置实现页面无乱码 237 0432 限制上传文件大小与时间 237 0433 配置验证级别 237 10.6 开发Web页其他功能 238 0434 如何使Pannel实现横向滚动纵向...

Global site tag (gtag.js) - Google Analytics