问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何读取web.config中自定义的信息

发布网友 发布时间:2022-04-27 13:38

我来回答

3个回答

懂视网 时间:2022-04-27 18:00

.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持。最近看到一些项目中还在自定义xml文件做程序的配置,所以忍不住写一篇用系统自定义配置的随笔了。
如果你已经对自定义配置了如指掌,请忽略这篇文章。
言归正传,我们先来看一个最简单的自定义配置
代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="simple" type="ConfigExample.Configuration.SimpleSection,ConfigExample"/>
  </configSections>
  <simple maxValue="20" minValue="1"></simple>
</configuration>

在配置文件中使用自定义配置,需要在configSections中添加一个section元素,并制定此section元素对应的类型和名字。然后再在configuration根节点下面添加此自定义配置,如上例中的simple节点。simple节点只有两个整形数的属性maxValue和minValue。
要在程序中使用自定义配置我们还需要实现存取这个配置块的类型,一般需要做如下三件事:
1. 定义类型从System.Configuration.ConfigurationSection继承
2. 定义配置类的属性,这些属性需要用ConfigurationProperty特性修饰,并制定属性在配置节中的名称和其他一些限制信息
3. 通过基类的string索引器实现属性的get ,set
非常简单和自然,如下是上面配置类的实现:
代码如下:
public class SimpleSection:System.Configuration.ConfigurationSection
{
    [ConfigurationProperty("maxValue",IsRequired=false,DefaultValue=Int32.MaxValue)]
    public int MaxValue
    {
        get
        {
            return  (int)base["maxValue"];
        }
        set
        {
            base["maxValue"] = value;
        }
    }

    [ConfigurationProperty("minValue",IsRequired=false,DefaultValue=1)]
    public int MinValue
    {
        get { return (int) base["minValue"];}
        set { base["minValue"] = value; }
    }

 
    [ConfigurationProperty("enabled",IsRequired=false,DefaultValue=true)]
    public bool Enable
    {
        get
        {
            return (bool)base["enabled"];
        }
        set
        {
            base["enabled"] = value;
        }
    }
}

这样子一个简单的配置类就完成了,怎么在程序中使用这个配置呢?需要使用ConfigurationManager类(要引用System.configuration.dll这个dll只有在.Net2.0之后的版本中才有)的GetSection方法获得配置就可以了。如下代码:
代码如下:
SimpleSection simple = ConfigurationManager.GetSection("simple") as SimpleSection;
Console.WriteLine("simple minValue={0} maxValue = {1}",simple.MinValue,simple.MaxValue);

这个配置类太过简陋了,可能有时候我们还需要更复杂的构造,比如在配置类中使用类表示一组数据,下面我们看一个稍微复杂一点的自定义配置
代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>
  </configSections>
  <complex height="190">
    <child firstName="James" lastName="Bond"/>
  </complex>
</configuration>

这个配置的名字是complex,他有一个属性height,他的节点内还有一个child元素这个元素有两个属性firstName和lastName;对于这个内嵌的节点该如何实现呢?首先我们需要定义一个类,要从ConfigurationElement类继承,然后再用和SimpleSection类似的方法定义一些用ConfigurationProperty特性修饰的属性就可以了,当然属性值的get,set也要使用基类的索引器。如下实现:
代码如下:
public class ComplexSection : ConfigurationSection
{
    [ConfigurationProperty("height", IsRequired = true)]
    public int Height
    {
        get
        {
            return (int)base["height"];
        }
        set
        {
            base["height"] = value;
        }
    }

    [ConfigurationProperty("child", IsDefaultCollection = false)]
    public ChildSection Child
    {
        get
        {
            return (ChildSection)base["child"];
        }
        set
        {
            base["child"] = value;
        }
    }
}

public class ChildSection : ConfigurationElement
{
    [ConfigurationProperty("firstName", IsRequired = true, IsKey = true)]
    public string FirstName
    {
        get
        {
            return (string)base["firstName"];
        }
        set
        {
            base["firstName"] = value;
        }
    }

    [ConfigurationProperty("lastName", IsRequired = true)]
    public string LastName
    {
        get
        {
            return (string)base["lastName"];
        }
        set
        {
            base["lastName"] = value;
        }
    }
}

还有稍微再复杂一点的情况,我们可能要在配置中配置一组相同类型的节点,也就是一组节点的集合。如下面的配置:
代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="complex" type="ConfigExample.Configuration.ComplexSection,ConfigExample"/>
  </configSections>
  <complex height="190">
    <child firstName="James" lastName="Bond"/>

    <children>
      <add firstName="Zhao" lastName="yukai"/>
      <add firstName="Lee" lastName="yukai"/>
      <remove firstName="Zhao"/>
    </children>
  </complex>
</configuration>

请看children节点,它就是一个集合类,在它里面定义了一组add元素,也可以有remove节点把已经添进去的配置去掉。
要使用自定义节点集合需要从ConfigurationElementCollection类继承一个自定义类,然后要实现此类GetElementKey(ConfigurationElement element)和ConfigurationElement CreateNewElement()两个方法;为了方便的访问子节点可以在这个类里面定义只读的索引器。请看下面的实现
代码如下:
public class Children : ConfigurationElementCollection
{
    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((ChildSection)element).FirstName;
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new ChildSection();
    }

    public ChildSection this[int i]
    {
        get
        {
            return (ChildSection)base.BaseGet(i);
        }
    }

    public ChildSection this[string key]
    {
        get
        {
            return (ChildSection)base.BaseGet(key);
        }
    }

}

当然要使用此集合类我们必须在Complex类中添加一个此集合类的属性,并要指定集合类的元素类型等属性,如下:
代码如下:
[ConfigurationProperty("children", IsDefaultCollection = false)]
    [ConfigurationCollection(typeof(ChildSection), CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap, RemoveItemName = "remove")]
    public Children Children
    {
        get
        {
            return (Children)base["children"];
        }
        set
        {
            base["children"] = value;
        }
}

我们会经常用到类似appSettings配置节的键值对的构造,这时候我们就不必再自己实现了,我们可以直接使用现有的System.Configuration.NameValueConfigurationCollection类来定义一个自定义的键值对。可以在Complex类中定义如下属性
代码如下:
[ConfigurationProperty("NVs", IsDefaultCollection = false)]
    public System.Configuration.NameValueConfigurationCollection NVs
    {
        get
        {
            return (NameValueConfigurationCollection)base["NVs"];
        }
        set
        {
            base["NVs"] = value;
        }
}

然后在配置文件的complex节中添加键值对配置
代码如下:
<NVs>
    <add name="abc" value="123"/>
    <add name="abcd" value="12d3"/>
</NVs>

到这儿已经基本上可以满足所有的配置需求了。不过还有一点更大但是不复杂的概念,就是sectionGroup。我们可以自定义SectionGroup,然后在sectionGroup中配置多个section;分组对于大的应用程序是很有意义的。
如下配置,配置了一个包含simple和一个complex两个section的sectionGroup
代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup type="ConfigExample.Configuration.SampleSectionGroup,ConfigExample" name="sampleGroup">
      <section type="ConfigExample.Configuration.SimpleSection,ConfigExample" allowDefinition="Everywhere" name="simple" />
      <section type="ConfigExample.Configuration.ComplexSection,ConfigExample" allowDefinition="Everywhere" name="complex"/>
    </sectionGroup>
  </configSections>
  <sampleGroup>
    <simple maxValue="20" minValue="1">
    </simple>

    <complex height="190">
      <child firstName="James" lastName="Bond"/>
      <children>
        <add firstName="Zhao" lastName="yukai"/>
        <add firstName="Lee" lastName="yukai"/>
        <remove firstName="Zhao"/>
      </children>
  <NVs>
    <add name="abc" value="123"/>
    <add name="abcd" value="12d3"/>
  </NVs>
    </complex>
  </sampleGroup>
</configuration>

为了方便的存取sectionGroup中的section我们可以实现一个继承自System.Configuration.ConfigurationSectionGroup类的自定义类。实现很简单,就是通过基类的Sections[“sectionName”]索引器返回Section。如下:
代码如下:
public class SampleSectionGroup : System.Configuration.ConfigurationSectionGroup
{
    public SimpleSection Simple
    {
        get
        {
            return (SimpleSection)base.Sections["simple"];
        }
    }

    public ComplexSection Complex
    {
        get
        {
            return (ComplexSection)base.Sections["complex"];
        }
    }
}

需要注意的是SectionGroup不能使用ConfigurationManager.GetSection(string)方法来获得,要获得sectionGroup必须通过Configuration类的SectionGroups[string]索引器获得,如下示例代码:
代码如下:
SampleSectionGroup sample = (SampleSectionGroup)ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).SectionGroups["sampleGroup"];

总结:
.Net framework给我们提供了一套很方便的配置库,我们只需要继承对应的类简单的配置一下就可以方便的使用在web.config或者app.config中配置的自定义节点了。
自定义配置文件节源码

热心网友 时间:2022-04-27 15:08

自定义信息,你没说明白是什么东西,自定义节点还是在connectionstring或appsetting中自定义的值,1、如果是获取自定义节点的话,可能比较麻烦,建议你在网上找一些公共的confighelper类库或者看一下这个博文 http://xiachanghao1990.blog.163.com/blog/static/48696024201211645150632/,定义自己的获取方法即可!
2、如果connectionstring或appsetting中自定义的值,那么就非常简单,页面中引用system.configration;,然后使用系统方法,ConfigurationManager.Connecctionstring[键值] 获取Connectionstring中的值或ConfigurationManager.AppSettings[键值]获取appsetting里的值!

热心网友 时间:2022-04-27 16:26

整个项目类型是什么样的,能大致说一下吗
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
谁告诉我一下,韩语中,“遵命”怎么说 想开个甜品店,不知道哪里可以学习呢 如何取消微信新号绑定的手机号? 翼支付-翼建钟情活动内容是什么? 怎么参加翼支付“翼建钟情”活动? 翼支付--翼建钟情立减10元-建行这次活动有具体名额限制吗? 西凤酒是哪里的 货车总重量不超过二十吨就不算超载吗? 自卸货车上装有二十多吨货已经有四五天了对货车能伤害哪个部位? 如何回复别人的"忙里偷闲"? 把这个视频下载到MP4........ 怎么将视频hlv格式的转换成mp4格式的,不是flv,名字后面没有后缀,加上.mp4也不行,格式工厂不行 怎么把影片下载到MP4里? 我的世界版本升级问题 我的世界编辑器,我要编辑地图时他说要升级到pro,可是我怎么升级啊? 我的世界手机版地图怎么升级 地图升级方法 我的世界 暮色森林地图升级或者扩大的方法 我的世界1.17更新之后地图什么也没有变,连物品栏什么也没有增加,这是为什么? 我的世界ios0.15.2版为什么做出来的地图不能用纸升级到更大的地图? 美国太平洋沿岸地区的经济发展比美国其他地区速度快的原因是什么? 为什么美国太平洋沿岸的降水量北部反而比南 近几年来美国太平洋沿岸地区的经济发展速度高于美国其他地区,主要原因是什麽 美国太平洋沿岸的洲有哪些 美国太平洋沿岸自南向北的气候依次为 美国太平洋沿岸地区属于什么气候区,有什 枸杞、菊花和西洋参一起泡水喝可以吗? 2016年生育保险可以报销多少钱 咸阳市2016年生育津贴是多少 请问2016年生育津贴是基本工资1900元吗 社保卡激活的具体方法 食品包装有抽签测运势宣传语违规吗 抽签能连续抽吗?一支签代表的运势有多久? 当月运势抽签 web.config配置错误 新浪微博访客问题,我想知道新浪微博主页的访客量算不算自己每天点开微博的次数,比如我今天打开微博10 请问微博主页访问量算不算上自己登陆的次数 据说什么浏览器内自动带有抢票器 ? ipad抢票浏览器用什么浏览器 怎么在web.config里添加appsettings 租了个汽车配件门市需要办理什么执照 评估公司出具的评估报告与执行标的严重不符,可又过了7天异议期,怎样才能让法_百度问一问 精酿啤酒酿造过程损失率 “&#47;”应用程序中的服务器错误。 (web.config怎么弄)追加分!!!!! login控件的web.config配置 应用 PSV welcome循环音效中怎么弄到20个球每次都是只能弄到12个 黄鹤翔的现在的老婆是谁啊?耳闻他离婚了! 英雄联盟 welcome to summoners&#39; rift 英文音效 黄鹤翔的老婆是谁 张艺谋老婆和巩俐之间有哪些差距? 哪里有xman中“ welcome professor”的音效