配置文件有两种设置方式,第一种是直接在网站根目录下的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. linux delete file

    今天不小心生成了这么个文件名的文件-ep-ser 然后 rm -ep-ser就删除不了,它认为-e是option 后来,用rm ./-ep-ser就顺利删除了,哈哈,教训啊

  2. CentOS 7 nginx+tomcat9 session处理方案之session复制

    我们的目标是所有服务器上都要保持用户的Session,那么将每个应用服务器中的Session信息复制到其它服务器节点上是不是就可以呢? 这就是Session的第二中处理办法:会话复制 192.168. ...

  3. sersync 开机自启 (仅供自己参考)

    sersync是一个实时同步的软件,,将其添加到/etc/rc.local中没有效果 ##之所以没效果是因为:####由于/etc/rc.local是/etc/rc.d/rc.local的软连接,所以 ...

  4. 面试(I)

    即时通讯 为什么要TCP连接建立3次? 假设是2次: 假如在第1次客户端向服务器端发送请求因为阻塞,客户端会再次给服务器端发送请求,这次服务器端和客户端建立了连接.这样双方就可以发送数据了,发送完以后 ...

  5. Twisted简介

    Twisted是用Python实现的基于事件驱动的网络引擎框架,Twisted支持许多常见的传输及应用层协议,包括TCP.UDP.SSL/TLS.HTTP.IMAP.SSH.IRC以及FTP.就像Py ...

  6. Dvelopment descriptor

    部署描述符是JavaEE程序常见的一部分,但是之前都没有较为全面的学习过,这里就较为全面的记录一下部署描述符中的元素.部署一个Servlet 3 或以上应用程序是一件轻而易举的事.通过Servlet注 ...

  7. HTTPS(SSL / TLS)免费证书申请及网站证书部署实战总结

    服务器环境:windows server 2008  +  tomcat7 废话不多说,先看部署效果: 一.免费证书申请 Let's Encrypt  简介:let's Encrypt 是一个免费的开 ...

  8. 使用js方法时,调用的方法名明明一致,但就是不管用,解决

    前提:代码全部写对 问题:调用的方法名明明一致,但就是不管用 举例:写了个function delete(){}方法, 点击调用delete方法,onclik="delete()" ...

  9. freeswitch设置支持视频语音编码

    1.修改FreeSWITCH安装路径下/conf/var.xml文件中,增加: <X-PRE-PROCESS cmd=="set" data="proxy_medi ...

  10. Intellij IDEA的下载安装与破解

    一,下载与安装 1.官网下载:https://www.jetbrains.com/idea/ 2.选择Windows对应版本安装 二,破解 1.下载破解补丁:http://idea.lanyus.co ...