配置文件有两种设置方式,第一种是直接在网站根目录下的web.config中设置;第二种方式是自定义配置文件,在web.config中指定其他配置文件的路径。

第一种:除了在常用的appSettings节点下进行<add/>添加,还可以在<configSections>节点下设置<section/>节点,具体如下:

  <configSections>
<!--以NameValue键值/对的形式返回配置节中的信息-->
<section name="Person" type="System.Configuration.NameValueSectionHandler"/>
<!--以Dictionary字典键值对的形式返回配置节中的信息-->
<section name="Man" type="System.Configuration.DictionarySectionHandler"/>
<!--基础结构。处理 .config 文件中由单个 XML 标记所表示的各配置节。-->
<section name="Name" type="System.Configuration.SingleTagSectionHandler" />
</configSections>
<!--自定义配置节点-->
<Person>
<add key="老大" value="刘备" />
<add key="老二" value="关羽" />
<add key="老三" value="张飞" />
</Person>
<Man>
<add key="老大" value="曹操" />
<add key="老二" value="典韦" />
<add key="老三" value="郭嘉" />
</Man>
<!--注意是要单个节SingleTagSectionHandler才能处理,但是无论你索性有多少个也能处理-->
<Name one="" two="" three="" four="" five="" />

调用方式:

        /// <summary>
/// 获取配置文件
/// </summary>
private static void GetConfigs()
{
//读取人名
NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("Person");
foreach (string key in nvc.AllKeys)
{
Console.WriteLine(key + ":" + nvc[key]);
} //读取男人
IDictionary dict = (IDictionary)ConfigurationManager.GetSection("Man");
foreach (string key in dict.Keys)
{
Console.WriteLine(key + ":" + dict[key]);
} IDictionary dict1 = (IDictionary)ConfigurationManager.GetSection("Name");
foreach (string key in dict1.Keys)
{
Console.WriteLine(key + ":" + dict1[key]);
}
}

其中Section节点里面的name是自定义节点的名称,type是接收配置节中的信息的数据类型。第一种方式可以使用.Net自带的几种数据类型进行装载数据,如:NameValue键值对、Dictionary字典和SingleTag基础结构。

第二种:在自定义配置文件中设置自定义的数据结构,通过指定文件路径加载配置文件,具体如下:

  <configSections>
<!--把Framework节点的数据映射到ConfigFile类中-->
<section name="Framework" type="ConsoleApplication.ConfigFiles.ConfigFile,ConsoleApplication"/>
</configSections>
<!--自定义配置节点-->
<Framework configSource="ConfigFiles\Framework.config"/>

自定义配置文件结构:

<Framework>
<Configs>
<add key="WebHost" value="127.0.0.1" description="网站基础地址"/>
<add key="LogTimer" value="" description="日志定时写入的时间间隔,单位秒。"/>
</Configs>
</Framework>

第二种方式中,Framework节点不再是key-value形式的,而是完全自定义的结构,并且在Framework节点下还有子节点<Configs>,此时不能通过.Net自带的三种数据类型进行装载,只能自定义一种接收Framework的数据类,如:

  /// <summary>
/// 配置文件类
/// </summary>
public class ConfigFile : ConfigurationSection
{
/// <summary>
/// 配置节点
/// </summary>
/// <value>配置集合</value>
[ConfigurationProperty("Configs", IsDefaultCollection = true)]
public ConfigNodeCollection Configs
{
get
{
return (ConfigNodeCollection)base["Configs"];
}
} /// <summary>
/// 获取配置字段值
/// </summary>
/// <param name="key">配置Key</param>
/// <param name="defaultValue">默认值</param>
/// <returns>配置值</returns>
public string GetValueWithKey(string key, string defaultValue = "")
{
return this.Configs.GetValueWithKey(key, defaultValue);
}
} /// <summary>
/// 配置节点列表
/// </summary>
public class ConfigNodeCollection : ConfigurationElementCollection
{
/// <summary>
/// 构造函数
/// </summary>
public ConfigNodeCollection()
{
ConfigNode element = this.CreateNewElement() as ConfigNode;
} /// <summary>
/// 根据索引获取配置节点
/// </summary>
/// <param name="index">索引值</param>
/// <returns>配置节点</returns>
public ConfigNode this[int index]
{
get
{
return this.BaseGet(index) as ConfigNode;
} set
{
if (this.BaseGet(index) != null)
{
this.BaseRemoveAt(index);
} this.BaseAdd(index, value);
}
} /// <summary>
/// 获取配置字段值
/// </summary>
/// <param name="key">配置Key</param>
/// <param name="defaultValue">默认值</param>
/// <returns>配置值</returns>
public string GetValueWithKey(string key, string defaultValue = "")
{
// 如果Key不存在则抛出异常
if (string.IsNullOrWhiteSpace(key))
{
throw new Exception("get Config Key is null");
} // 查找Key的值 // Key值忽略大小写
foreach (ConfigNode item in this)
{
if (item.Key.ToLower().Equals(key.ToLower()))
{
return item.Value;
}
} // 如果默认值不为空,返回默认值
if (!string.IsNullOrWhiteSpace(defaultValue))
{
return defaultValue;
} // 抛出未找到Key的异常
throw new Exception(string.Format("Key:{0} Is not find!", key));
} /// <summary>
/// 创建节点函数
/// </summary>
/// <returns>节点对象</returns>
protected override ConfigurationElement CreateNewElement()
{
return new ConfigNode();
} /// <summary>
/// 获取节点Key
/// </summary>
/// <param name="element">节点对象</param>
/// <returns>节点Key值</returns>
protected override object GetElementKey(ConfigurationElement element)
{
ConfigNode serverElement = element as ConfigNode;
return serverElement.Key;
}
} /// <summary>
/// 配置节点
/// </summary>
public class ConfigNode : ConfigurationElement
{
[ConfigurationProperty("key", IsRequired = true)]
public string Key
{
get
{
return base["key"].ToString();
}
set
{
base["key"] = value;
}
} [ConfigurationProperty("value", IsRequired = true)]
public string Value
{
get
{
return base["value"].ToString();
}
set
{
base["value"] = value;
}
} [ConfigurationProperty("description", IsRequired = true)]
public string Description
{
get
{
return base["description"].ToString();
}
set
{
base["description"] = value;
}
}
}

调用如下:

        /// <summary>
/// 获取自定义配置文件
/// </summary>
private static void GetConfigs() {
ConfigFile config = ConfigurationManager.GetSection("Framework") as ConfigFile;
if (config == null)
{
throw new Exception("未找到对应节点");
}
string WebHost = config.GetValueWithKey("WebHost");
string LogTimer = config.GetValueWithKey("LogTimer");
Console.WriteLine("WebHost:"+WebHost);
Console.WriteLine("LogTimer:"+LogTimer);
}

其中用到了.Net自带的几个数据类:ConfigurationSection、ConfigurationElementCollection、ConfigurationElement和ConfigurationProperty,它们都是跟配置节点相关的类,有兴趣的可以深入了解下。

至此,自定义配置文件就搞定了,在大型项目中或者在与多个外部系统有接口交互的项目中会需要用到多配置文件,都在web.config里写不利于维护。采用第二种方式,只需在web.config文件中配置路径,如需修改配置只需要修改自定义配置文件即可,这样也可以避免修改web.config导致Session丢失。

C# 自定义配置文件的更多相关文章

  1. thinkphp3.2自定义配置文件

    扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样. 设置扩展配置的方式如下(多个文件用逗号分隔): // 加载扩展配置文件 'LOAD_EXT_CONFIG' => 'u ...

  2. beego里面自定义配置文件

    beego编译好的exe通过全路径调用会crash,看了半天,发现是解析不到配置文件,研究了下 发现beego自定义配置文件以后,需要手工parse,我表示,以为是自动化的,没想到是半自动化的…… 追 ...

  3. Springboot读取配置文件及自定义配置文件

    1.创建maven工程,在pom文件中添加依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...

  4. springboot读取自定义配置文件节点

    今天和大家分享的是自定义配置信息的读取:近期有写博客这样的计划,分别交叉来写springboot方面和springcloud方面的文章,因为springboot预计的篇章很多,这样cloud的文章就需 ...

  5. SpringBoot之加载自定义配置文件

    SpringBoot默认加载配置文件名为:application.properties和application.yml,如果需要使用自定义的配置文件,则通过@PropertySource注解指定. J ...

  6. Spring Boot2.0自定义配置文件使用

    声明: spring boot 1.5 以后,ConfigurationProperties取消locations属性,因此采用PropertySource注解配合使用 根据Spring Boot2. ...

  7. MySQL 5.6容器使用自定义配置文件的权限问题

    提出问题: 在使用Rancher2.0.2部署一个mysql deployment时,我们会发现,如果只设置/var/lib/mysql数据目录时,mysql容器(pod)能够正常启动,一旦数据目录和 ...

  8. Springboot 之 自定义配置文件及读取配置文件

    本文章来自[知识林] 读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两 ...

  9. Springboot 之 自定义配置文件及读取配置文件注意:配置文件中的字符串不要有下划线 .配置中 key不能带下划线,value可以(下划线的坑,坑了我两天..特此纪念)

    注意:配置文件中的字符串不要有下划线 .配置中  key不能带下划线,value可以 错误的.不能读取的例子: mySet .ABAP_AS_POOLED      =  ABAP_AS_WITH_P ...

随机推荐

  1. form提交xml文件

    --为何ajax提交不了xml?--原因:Request.Form["Data"]这种获取参数方式,原本就不是mvc路由参数获取方式,这是Asp.net中webfrom页面获取参数 ...

  2. mysql误删root

    在Linux中有时安装Mysql会出现没有root用户的状况,或者说root账户被从mysql.user表中误删除,这样就导致很多权限无法控制.解决办法是重新创建root用户,并授予所有权限,具体方法 ...

  3. Tomcat增加Context配置不带项目名访问导致启动的时候项目加载两次

    eclipse发布web应用至tomcat,默认方式下访问该项目是需要带项目名称的,例http://localhost:8080/myapp/.现在需要改成这样访问http://localhost.修 ...

  4. Apriori

    基本概念 项与项集:设itemset={item1, item_2, …, item_m}是所有项的集合,其中,item_k(k=1,2,…,m)成为项.项的集合称为项集(itemset),包含k个项 ...

  5. 连接redis错误:ERR Client sent AUTH, but no password is set

    问题原因:没有设置redis的密码 解决:命令行进入Redis的文件夹: D:\Redis-x64-3.2.100>redis-cli.exe 查看是否设置了密码: 127.0.0.1:6379 ...

  6. yum无法安装的pdksh

    yum无法安装的pdksh,本地pdksh-5.2.14-37.el5_8.1.x86_64.rar,点击下载.

  7. Tomcat基本

    Tomcat web 应用服务器基础 jdk+tomcat安装 1.运行Tomcat为什么要装jdk? http://blog.sina.com.cn/s/blog_753bc97d0102w5rd. ...

  8. 剑指offer(50)数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  9. 【做题】SDOI2017苹果树——dfs序的运用

    原文链接 https://www.cnblogs.com/cly-none/p/9845046.html 题意:给出一棵\(n\)个结点的树,在第\(i\)个结点上有\(a_i\)个权值为\(v_i\ ...

  10. WDTP注册破解

    简介 WDTP 不止是一款开源免费的 GUI 桌面单机版静态网站生成器和简单方便的前端开发工具,更是一款跨平台的集笔记.个人知识管理.写作/创作.博客/网站内容与样式管理等功能于一体的多合一内容处理/ ...