配置文件有两种设置方式,第一种是直接在网站根目录下的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. XMLHttpRequest请求被劫持

    十几个请求中随机一个转到 <html><head><script language="javascript">setTimeout(" ...

  2. 分布式异步任务Celery

    -A代表APP celery -A tasks worker --loglevel=info -n nodemaster -------------- celery@nodemaster v4.1.0 ...

  3. django中的数据库迁移

    Django是用python写的web开发框架,其特点是: 1.重量级框架,内部封装了很多的功能组件,使开发变的简便快速, 2.MVT模式:前后端分离,高内聚低耦合,m:model,与mvc中的m功能 ...

  4. 20165215 2017-2018-2《Java程序设计》课程总结

    20165215 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业1:我期望的师生关系:令我记忆深刻的老师,期望的师生关系,本学期的学习规划. 预备作业二 ...

  5. TCP/IP协议详解内容总结(怒喷一口老血)

    TCP/IP协议(本文源自外部链接) TCP/IP不是一个协议,而是一个协议族的统称.里面包括IP协议.IMCP协议.TCP协议. 这里有几个需要注意的知识点: 互联网地址:也就是IP地址,一般为网络 ...

  6. MySQL MHA 报错处理

    安装环境:CentOS 6.5 MySQL 5.7.22 MHA 0.56 1.找不到mysql 命令 Sat Mar 23 07:17:50 2019 - [info] Connecting to ...

  7. nodejs笔记之初识node

    1.安装node; node -v  //检测node是否安装成功 node可以做什么: 搭建服务器: 读写文件: 连接数据库: 爬虫: node的模块系统: 原生模块(如http,fs); 自定义模 ...

  8. linux 安装nginx+php+mysql

    http://www.cnblogs.com/kyuang/p/6801942.htmlnginx安装 本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库 ...

  9. Linux Time_wait网络状态 调优

    Time_wait状态 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了. 如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时 ...

  10. iOS报错总结

    1. new Date('2018-07-18 14:58:32').getTime();      //在ios上拿报Invalid Date    无法转化 Safari 正确解析new Date ...