配置文件有两种设置方式,第一种是直接在网站根目录下的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="1" two="2" three="3" four="4" five="5" />

调用方式:

        /// <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="10" 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丢失。

转载于:https://www.cnblogs.com/len0031/p/7571594.html

C# 自定义配置文件相关推荐

  1. spring配置文件_SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件...

    SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件 一.概述 Spring Boot允许多种配置来源,官网是这样说的: Spring Boot使用一种非常特殊的Property ...

  2. Springboot-读取核心配置文件及自定义配置文件

    读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单. 核心 ...

  3. mysql etc rc.local_CentOS 7 开机启动自定义配置文件:/etc/rc.local 不执行解决办法 | IT运维网...

    最近在安装程序时发现CentOS 7的开机自定义配置文件(/etc/rc.local)内配置了启动脚本不会开机执行:于是查看了下配置文件内容发现了问题的原因 [root@localhost ~]# c ...

  4. spring boot自定义配置文件

    把一些可能会经常变动的东西写在配置文件中,可以增加程序的灵活性,避免多次改版发版. 在sping boot中除了自带的默认配置文件application.properties之外,我们还可以在reso ...

  5. log4j自定义配置文件(SpringMVC项目)

    问题来源 本周在实际项目中发现无法自定义的log4j-dev配置的error日志级别文件无法生效,项目启动后仍然采用默认的info级别日志进行打印.之所以自定义名称,是为了减少隔离不同环境的日志级别, ...

  6. (原)举例说明C#自定义配置文件app.config及如何读取配置内容(在app.config加入自定义的XML节点)?...

    App.config文件如下: <?xml version="1.0" encoding="utf-8" ?> <configuration& ...

  7. Spring Boot基础学习笔记04:Spring Boot加载自定义配置文件

    文章目录 零.学习目标 1.熟悉使用@PropertySource加载配置文件 2.熟悉使用@ImportResource加载XML配置文件 3.掌握使用@Configuration编写自定义配置类 ...

  8. lumen 下使用自定义配置文件

    由于lumen与laravel有一定的区别,在lumen根目录下没有config文件,因此在lumen下使用自定义配置文件的时候有区别,如下步骤 1,在根目录下新建config文件夹 2,在confi ...

  9. python自定义配置文件读取_python读取和自定义配置文件的方法

    python读取和自定义配置文件的方法,有需要的朋友可以参考下. python读取配置文件很方便. 例如下面的配置文件: 0.ini文件: ----文件开始---- [global] ip = 192 ...

最新文章

  1. 通过案例对SparkStreaming透彻理解-3
  2. 云在物联网中的惊人优势 | 技术头条
  3. .NET设计模式(1): 简单工厂模式
  4. 敏捷结果30天练习即将开始
  5. asp.net 返回表单json数据 辅助类
  6. 摄像头(WebCam)在Linux操作系统中的驱动方法
  7. Mysql提权之反弹shell
  8. MT4跟单软件的API跟单模式有多少种?
  9. 基于Cocos2d-x学习OpenGL ES 2.0之多纹理
  10. 华为HCIE-RS(数通)论述题(一)
  11. “掌上理财”项目总结
  12. 一只青蛙一次可以跳上1级台阶也可以跳上2级求该青蛙跳上一个n级的台阶总共有多少种跳法
  13. python用函数绘制椭圆_Python学习笔记——opencv绘制椭圆
  14. php vox转码,php base64 编码图片,音频,视频
  15. 单词串联记忆 - 故事 - Party上浪漫的事后传
  16. python win32gui+pynput 自动回复qq消息
  17. nyoj-264-国王的魔镜
  18. InnoDB存储引擎 随记
  19. Android各国语言对照表
  20. 微信小程序 - 实现导航栏和内容上下联动功能

热门文章

  1. linux账号登陆安全性相关命令
  2. 百度网盘爬虫(如何爬取百度网盘)
  3. php不常用,却很实用的6个字符串函数
  4. 网络聊天室的技术与发展
  5. Entity Framework 4.3尝试体会
  6. Seam - 无缝集成 JSF,第 1 部分: 为 JSF 量身定做的应用程序框架
  7. hibernate get方法有执行sql但是后台拿不到_「6」进大厂必须掌握的面试题-Hibernate...
  8. xps15u盘装linux,Dell XPS 15 9560 安装 Ubuntu 18.04
  9. html 轮播_Axure教程:使用动态面板实现轮播图
  10. html让图片自动旋转360,html5 canvas 360图片旋转制作抽奖转盘代码