C# 自定义配置文件
配置文件有两种设置方式,第一种是直接在网站根目录下的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# 自定义配置文件的更多相关文章
- thinkphp3.2自定义配置文件
扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样. 设置扩展配置的方式如下(多个文件用逗号分隔): // 加载扩展配置文件 'LOAD_EXT_CONFIG' => 'u ...
- beego里面自定义配置文件
beego编译好的exe通过全路径调用会crash,看了半天,发现是解析不到配置文件,研究了下 发现beego自定义配置文件以后,需要手工parse,我表示,以为是自动化的,没想到是半自动化的…… 追 ...
- Springboot读取配置文件及自定义配置文件
1.创建maven工程,在pom文件中添加依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...
- springboot读取自定义配置文件节点
今天和大家分享的是自定义配置信息的读取:近期有写博客这样的计划,分别交叉来写springboot方面和springcloud方面的文章,因为springboot预计的篇章很多,这样cloud的文章就需 ...
- SpringBoot之加载自定义配置文件
SpringBoot默认加载配置文件名为:application.properties和application.yml,如果需要使用自定义的配置文件,则通过@PropertySource注解指定. J ...
- Spring Boot2.0自定义配置文件使用
声明: spring boot 1.5 以后,ConfigurationProperties取消locations属性,因此采用PropertySource注解配合使用 根据Spring Boot2. ...
- MySQL 5.6容器使用自定义配置文件的权限问题
提出问题: 在使用Rancher2.0.2部署一个mysql deployment时,我们会发现,如果只设置/var/lib/mysql数据目录时,mysql容器(pod)能够正常启动,一旦数据目录和 ...
- Springboot 之 自定义配置文件及读取配置文件
本文章来自[知识林] 读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两 ...
- Springboot 之 自定义配置文件及读取配置文件注意:配置文件中的字符串不要有下划线 .配置中 key不能带下划线,value可以(下划线的坑,坑了我两天..特此纪念)
注意:配置文件中的字符串不要有下划线 .配置中 key不能带下划线,value可以 错误的.不能读取的例子: mySet .ABAP_AS_POOLED = ABAP_AS_WITH_P ...
随机推荐
- word2vec:将bin转换为txt
转自:https://blog.csdn.net/u011684265/article/details/78024064 from gensim.models import word2vec mode ...
- Elasticsearch 快速入门教程
面向文档 应用中的对象很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期.地理位置.另一个对象或者数组. 总有一天你会想到把这些对象存储到数据库中.将这些数据保存到由行和列组成的关系数 ...
- C工程 交互 ceph 分布式存储系统
网上看到有人问,如何在C项目里调用ceph系统对外提供的API,实现分布式存储. 我在网上搜到了相关信息,但是因为不是会员无法追加答案,故而,贴于此. 赠予有缘人:) ———————————————— ...
- 《More Accurate Question Answering on Freebase》文献笔记
bast-2015-CIKM CIKM全称是International Conference on Information and Knowledge Management 这篇文章主要采用采用lea ...
- 基于容器与微服务架构的Web应用示例eShopOnContainers
简介 微软官方提供了一个基于Docker和微服务的示例应用eShopOnContainers:它使用了面向服务的架构并且从服务端到客户端都是跨平台的:该架构使用通过http作为客户端与服务端直接的通信 ...
- 020-Json结构数据序列化异步传递
C#中将.Net对象序列化为Json字符串的方法: JavaScriptSerializer().Serialize(p),JavaScriptSerializer在System.Web.Extens ...
- P3371 【模板】单源最短路径(弱化版)(Dijkstra算法)
题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...
- 从路由器镜像中提取uImage头信息
uImage header为64字节,文件头为27 05 19 56 hexdump -C a.bin | grep "27 05 19 56" 或者 hd aa.bin | gr ...
- CEF 设置Cookie
参考文档:http://magpcss.org/ceforum/apidocs3/projects/(default)/CefCookieManager.html 转载:https://www.cnb ...
- 尚硅谷面试第一季-18ES与Solr的区别
背景:它们都是基于Lucene搜索服务器基础之上开发,一款优秀的,高性能的企业级搜索服务器.[是因为他们都是基于分词技术构建的倒排索引的方式进行查询] 开发语言:Java语言开发 诞生时间:Solr ...