Web.ipconfigg 和 App.ipconfigg 的区别分析

恼火!不小心点到全屏幕模式,刚写的东西全丢了!!从头再来!!!
  无论是web程序、windows程序、windows service程序,配置文件都是少不了的。我们都习惯了将连接字符串放在ConnectionString节点中,将程序的设置放在appSetting节点中。
恼火!不小心点到全屏幕模式,刚写的东西全丢了!!从头再来!!!
  无论是web程序、windows程序、windows service程序,配置文件都是少不了的。我们都习惯了将连接字符串放在ConnectionString节点中,将程序的设置放在appSetting节点中。配置文件的管理程序为我们提供了方便的管理方式,那么,我们如何自定义配置节点呢?
  有两种方法,其一,继承IConfigurationSectionHandler,通过实现Create方法。这种方法的灵活度非常大,我们需要动手解析自定义节点的XmlNode,所以,实现起来也比较复杂。其二,继承ConfigurationSection,这种方法就简单多了,只需要指定对应的属性名称即可。
  本文旨在使用最少的代码实现自定义配置节点,所以果断放弃第一种方法,使用第二种方法实现自定义配置节点。
  光说不练假把式,接下来我们就着手使用第二种方法实现自定义配置节点。步骤如下:
  1.在configSections节点中定义自定义配置节点信息
&configSections&&section name="custom" type="SampleWebConfigSection.Configuration.customSection, SampleWebConfigSection" /&&/configSections&
name:自定义配置节点的名称
type:类型,自定义配置节点对应的数据类型
  2.完成自定义配置节点的结构
&custom fileName="Default.txt" maxUsers="2500" maxIdleTime="00:10:00" /&
  3.编程实现节点的访问
customSection代码
ConfigurationProperty标记:指示 .NET Framework 通过custom节点的属性来实例化对象的字段值。对于每一个标记有此特性的属性,.NET Framework 都使用反射来读取修饰参数,并创建相关的 ConfigurationProperty 实例。
StringValidator标记:以声明的方式指示 .NET Framework 对配置属性执行字符串验证。
LongValidator标记:以声明的方式指示 .NET Framework 对配置属性执行长整型验证。
TimeSpanValidator标记:以声明的方式指示 .NET Framework 对配置属性执行时间验证。
  4.自定义配置节点的使用
customSection custom = (customSection)System.Configuration.ConfigurationManager.GetSection("custom");
Response.Write(custom.FileName + "|" + custom.MaxUsers.ToString() + "|" + custom.MaxIdleTime);
  在第一句代码中,我们通过ConfigurationManager.GetSection获取custom节点,并强制类型转换为我们自定义的节点,这样就能够方便的使用了。
  OK,第一个例子完成。其实这个例子是MSDN中的,我将它拿下来,稍加说明而已。
  当然,只有上面这些内容是不足以放首页的。上面的例子并不能完全满足我们常规的需求,甚至我们可以把这些配置放在appSetting中来替代我们的自定义配置节点。下面介绍一个实际的需求:
  在网站的建设中,我们希望将网站的标题、副标题和网址放在一条配置中,因为网站有文件上传功能,我们希望在配置中限制上传文件的大小,并针对不同的上传类型将文件放在不同的目录中。定以后的节点结构如下:
&webSetting&&base title="草屋&拾荒" subTitle="七千米深蓝的博客" url=""&&/base&&fileUpload&&file name="headPhoto" path="upload/image/headPhoto" size="200"&&/file&&file name="album" path="upload/image/album" size="1024"&&/file&&/fileUpload&&/webSetting&
  要完成这个自定义配置节点,按照第一个例子的步骤,我们需要现在configSections中配置自定义节点信息:
&section name="webSetting" type="SampleWebConfigSection.Configuration.webSettingSection, SampleWebConfigSection" /&
  不解释,接下来我们需要完成四个类:
webSettingSection
baseSection
fileUploadSection
fileSection
  这四个类分别对应这个配置中的四个节点:webSetting、base、fileUpload和file。
webSettingSection 代码
  派生自ConfigurationSection,包含两个属性:BaseSetting和FileUploadSetting,这两个属性分别对应配置文件中的两个子节点base 和fileUpload。
baseSection 代码
  派生自ConfigurationElement,因为它是一个子元素,被包含在webSettingSection类中。它的几个属性不作解释。
fileUploadSection 代码
  派生自ConfigurationElementCollection,因为它是一个子元素的集合,它包含一个fileSection的集合。
  这个类使用了如下的标记:
[ConfigurationCollection(typeof(fileSection), AddItemName = "file")]
  这是一个子元素集合的说明,第一个type参数是必须的,它指定了包含子集的类型。第二个参数是可选的,它指定了要添加到集合中的子节点的节点名,默认是是add,我们没有使用默认值,而是使用了“file”,所以在这里进行了指定。
  另外,这个类还实现了通过index和name获取一个fileSection的方法,分别是this[int index]和this[string name]。基类本身存在通过字符串获取子元素的方法,所以这里要使用new关键字。
fileSection 代码
  派生自ConfigurationElement。它的属性很简单,不解释。
  我们可以使用如同第一个示例中使用自定义配置节点的方法使用这个配置节点。但通常我们不希望每次使用的时候都重新加载一次配置项,所以,我们通过一个静态对象来访问这个配置节点:
namespace SampleWebConfigSection.Configuration
{public class WebSettingManager
{public static webSettingSection WebSetting = (webSettingSection)System.Configuration.ConfigurationManager.GetSection("webSetting");
  测试一下我们的自定义配置节点是否好使,在网站的页面中加入如下代码:
&asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"&&h2&&asp:Label ID="lblTitle" Text="" runat="server" /&&/h2&&h3&&asp:Label ID="lblSubTitle" Text="" runat="server" /&&/h3&
地址:&asp:Label ID="lblUrl" Text="" runat="server" /&&p&&/p&&p&&/p&&asp:GridView ID="gvFileUploadSetting" runat="server" Width="300" BackColor="#F0F8FF" AutoGenerateColumns="false"&&Columns&&asp:TemplateField HeaderText="名称"&&HeaderStyle Width="80px" Font-Bold="true" /&&ItemStyle Font-Bold="false" /&&ItemTemplate&&%#Eval("name")%&&/ItemTemplate&&/asp:TemplateField&&asp:TemplateField HeaderText="路径"&&HeaderStyle Width="160px" Font-Bold="true" /&&ItemStyle Font-Bold="false" /&&ItemTemplate&&%#Eval("path")%&&/ItemTemplate&&/asp:TemplateField&&asp:TemplateField HeaderText="大小"&&HeaderStyle Width="60px" Font-Bold="true" /&&ItemStyle Font-Bold="false" /&&ItemTemplate&&%#Eval("size")%&&/ItemTemplate&&/asp:TemplateField&&/Columns&&/asp:GridView&&/asp:Content&
protected void Page_Load(object sender, EventArgs e)
{this.Title = WebSettingManager.WebSetting.BaseSetting.title + " - " + WebSettingManager.WebSetting.BaseSetting.subTthis.lblTitle.Text = WebSettingManager.WebSetting.BaseSetting.this.lblSubTitle.Text = WebSettingManager.WebSetting.BaseSetting.subTthis.lblUrl.Text = WebSettingManager.WebSetting.BaseSetting.this.gvFileUploadSetting.DataSource = WebSettingManager.WebSetting.FileUploadSthis.gvFileUploadSetting.DataBind();
  运行网站,我们可以看到如下界面,说明我们的配置节点是可用的:
我们可以休息了,哈哈,附上源代码:
另外,通过实现System.Configuration.IConfigurationSectionHandler接口来实现自定义配置节点感兴趣的朋友可以
再附上MSDN上面关于两种实现方法的地址:
/zh-cn/library/2tw134k3(v=VS.100).aspx
/zh-cn/library/ms228056.aspx
我们可以真的休息了,如果你觉得这篇文章还不错,点击一下推荐链接也不费劲,却可以给我很大鼓励,谢谢您的关注!
-------------------------------------------------
ps.补充一点Configuration自定义节点结构:
ConfigurationSection:对应整个自定义节点Xml的最外层节点
ConfigurationElement:Section节点下的一个子节点,不包含集合
ConfigurationElementCollection:对应Element集合
如果认为此文对您有帮助,别忘了支持一下哦!
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
转载:/youring2/archive//webconfigsection.html
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】浅析混合云和跨地域网络构建实践,分享高性能负载均衡设计,9月21日阿里云专家和你说说网络那些事儿,足不出户看直播,赶紧预约吧!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
MaxCompute75折抢购
Loading...C#/.NET(38)
web.config是web应用程序的配置文件,为web应用程序提供相关配置。在你开发的web程序中,你可以为每一个文件夹建立一个web.config.
app.config是桌面应用程序的配置文件。在vs.net中创建一个桌面应用程序工程并添加了应用程序配置文件时,它会自动命名为&appname&.exe.config,并且自动与你的程序进行关联。
不管是web.config,还是app.config,你都可以使用下面的方法获取appsetting节的值:
System.Configuration.COnfigurationSettings.AppSettings[&Key&]
如果你对web.config进行了修改,你的web应用程序将立即加载新的web.config。而当你对app.config进行了修改,必须重新启动桌面应用程序,app.config才能生效。
在一些资料上找到了以下一些东西,但不能确定两者之间会不会还有其他的不同:
app.config,顾名思义,是桌面应用程序的配置文件,它不能用于Class类库。web.config是ASP.NET应用程序的配置文件。
(ps:Class类库其实可以用读xml的方法读取配置文件,但是貌似不能使用ConfigurationSettings.AppSettings(&&))
比如说,在一个拥有web.config的ASP.NET应用程序项目中,包含一个用C#写成的拥有app.config的class类库,那么当这个项目运行的时候,和它关联的配置文件应该是web.config,而不是app.config,因为它是一个ASP.NET应用程序
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:50645次
排名:千里之外
转载:36篇
(1)(1)(20)(22)  昨天修改代码发现了一个问题,由于自己要在WCF服务接口中添加了一个方法,那么在相应调用的地方进行更新服务就可以了,不料意外发生了,竟然无法更新。左查右查终于发现了问题。App.config配置文件中的配置貌似出现了问题。查找节点发现是如下节点:
&configSections&
&section name="Test1" type="Demo.Section1,Demo"/&
..............
&/configSections&
我当时也只是看到了下划波浪线,才猜测是这里的问题,于是我把configSections节点注释后,重新更新WCF服务,没想到真的可以更新了,心想这是个什么节点呢,虽然之前自己也见过这个节点,但是从来没用过,于是趁此机会就进行简单的学习一下吧,以便之后说不定什么时候就会用到。
  这里我的讲解暂时之针对.NET的Web.config文件和App.confg文件,也就是对.Net配置文件自定义节点进行学习记录。
配置文件优先级
&在此简单的学习一个配置文件的优先级吧,因为自己之前对配置文件接触的也比较少,没详细的进行学习过。
&首先在.net提供了一个针对当前机器的配置文件,这个文件是machine.config。所在地址如下图所示。
然后此文件夹下还存在一个Web.confg的配置文件。
asp.net网站IIS启动的时候会加载配置文件中的配置信息,然后缓存这些信息,这样就不必每次去读取配置信息。在运行过程中asp.net应用程序会监视配置文件的变化情况,一旦编辑了这些配置信息,就会重新读取这些配置信息并缓存。
1、如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找。 2、如果当前页面所在目录下不存在web.config文件或者web.config文件中不存在该结点名,则查找它的上级目录,直到网站的根目录。
3、如果网站根目录下不存在web.config文件或者web.config文件中不存在该节点名则在C:WindowsMicrosoft.NETFrameworkv4.0.30319Config/web.config文件中查找。(这是我本机的地址,请根据情况进行调整) 4、如果在C:WindowsMicrosoft.NETFrameworkv4.0.30319Config/web.config文件中不存在相应结点,则在C:WindowsMicrosoft.NETFrameworkv4.0.30319Config/machine.config文件中查找。 5、如果仍然没有找到则返回null。
所以如果我们对某个网站或者某个文件夹有特定要求的配置,可以在相应的文件夹下创建一个web.config文件,覆盖掉上级文件夹中的web.config文件中的同名配置即可。这些配置信息的寻找只查找一次,以后便被缓存起来供后来的调用。在asp.net应用程序运行过程中,如果web.config文件发生更改就会导致相应的应用程序重新启动,这时存储在服务器内存中的用户会话信息就会丢失(如存储在内存中的Session)。
  所以如果我们对某个网站或者某个文件夹有特定要求的配置,可以在相应的文件夹下创建一个web.config文件,覆盖掉上级文件夹中的web.config文件中的同名配置即可。这些配置信息的寻找只查找一次,以后便被缓存起来供后来的调用。在asp.net应用程序运行过程中,如果web.config文件发生更改就会导致相应的应用程序重新启动,这时存储在服务器内存中的用户会话信息就会丢失(如存储在内存中的Session)。一些软件(如杀毒软件)每次完成对web.config的访问时就会修改web.config的访问时间属性,也会导致asp.net应用程序的重启。
常用配置文件节点appSettings和connectionSettings说明
&1、&appSettings&节点
&appSettings&节点主要用来存储asp.net应用程序的配置信息,例如网站上传文件的类型:
&appSettings&
&!--允许上传的格式类型--&
&add key="ImageType" value=".....jpeg"/&
&!--允许上传的文件类型--&
&add key="FileType" value="..........doc"/&
&/appSettings&
对于&appSettings&节点中的值可以按照key来进行访问,以下就是一个读取key值为&FileType&节点值的例子:
string fileType=ConfigurationManager.AppSettings["FileType "];
2、&connectionStrings&节点
&connectionStrings&节点主要用于配置数据库连接的,我们可以&connectionStrings&节点中增加任意个节点来保存数据库连接字符串,将来在代码中通过代码的方式动态获取节点的值来实例化数据库连接对象,这样一旦部署的时候数据库连接信息发生变化我们仅需要更改此处的配置即可,而不必因为数据库连接信息的变化而需要改动程序代码和重新部署。数据库链接示例如下:
&connectionStrings&
&add name="OraProfileConnString" connectionString="user id=data source=CRMDB;password=123456;" providerName="System.Data.OracleClient"/&
&/connectionStrings&
在代码中我们可以这么实例化数据库连接对象:
///1读取web.config文件节点配置
string ConnectionStringProfile = ConfigurationManager.ConnectionStrings["OraProfileConnString"].ConnectionS
///2实例化OracleConnection对象
OracleConnection conn = new OracleConnection(ConnectionStringProfile);
这样做的好处是一旦开发时所用的数据库和部署时的数据库不一致,仅仅需要用记事本之类的文本编辑工具编辑connectionString属性的值就行了。
自定义节点配置解析
&经过查阅资料发现,有些人和我一样,只用过我上面说的两个节点,但是如果参数过多,这种做法的缺点也会明显地暴露出来:appSetting中的配置参数项只能按key名来访问,不能支持复杂的层次节点也不支持强类型, 而且由于全都只使用这一个集合,你会发现:完全不相干的参数也要放在一起!解决的方法便是使用自定义节点配置来解析。
我们来看一下如何在app.config或者web.config中增加一个自定义的配置节点。 在这篇博客中,我将介绍4种自定义配置节点的方式。
1、第一种情况&&Property
配置文件如下,依照属性的方式处理:
&?xml version="1.0" encoding="utf-8" ?&
&configuration&
&configSections&
&section name="Test1" type="Demo.Section1,Demo"/&
&/configSections&
&Test1 UserName="aehyok" Path="/aehyok"&&/Test1&
&/configuration&
自定义一个类,以ConfigurationSection为基类,各个属性要加上[ConfigurationProperty] ,ConfigurationProperty的构造函数中传入的name字符串将会用于config文件中,表示各参数的属性名称。
属性的值的读写要调用this[],由基类去保存。
为了能使用配置节点能被解析,需要在&configSections&中注册,代码如上&section name="Test1" type="Demo.Section1,Demo"/&。
实现代码如下:
namespace Demo
public class Section1 : ConfigurationSection
[ConfigurationProperty("UserName")]
public string UserName
get { return this["UserName"].ToString(); }
set { this["UserName"] = }
[ConfigurationProperty("Path")]
public string Path
get { return this["Path"].ToString(); }
set { this["Path"] = }
下面将要介绍另三种配置节点虽然复杂一点,但是一些基础的东西与这个节点是一样的,所以后面我就不再重复说明了。
2、第二种情况&&Element
配置文件如下:
&?xml version="1.0" encoding="utf-8" ?&
&configuration&
&configSections&
&section name="Test2" type="Demo.Section2,Demo"/&
&/configSections&
&Users UserName="aehyok" Password="123456"&&/Users&
&/configuration&
实现代码如下:
namespace Demo
public class Section2 : ConfigurationSection
[ConfigurationProperty("Users", IsRequired = true)]
public SectionElement Users
get { return (SectionElement)this["Users"]; }
public class SectionElement : ConfigurationElement
[ConfigurationProperty("UserName", IsRequired = true)]
public string UserName
get { return this["UserName"].ToString(); }
set { this["UserName"] = }
[ConfigurationProperty("Password", IsRequired = true)]
public string Password
get { return this["Password"].ToString(); }
set { this["Password"] = }
第二种情况比第一种情况的区别就是,数据类型也是自己定义的,具体的配置属性写在ConfigurationElement的继承类中。
3、第三种情况&&CDATA
CDATA可以包含比较长的字符串,且可以包含HTML代码段,这样针对特殊字符的存放也比较方便。假如如下配置:
&?xml version="1.0" encoding="utf-8" ?&
&configuration&
&configSections&
&section name="Test3" type="Demo.Section3,Demo"/&
&/configSections&
Create proc _bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output
with encryption ---------加密
bankMoney (id,userID,sex,Money)
Values(@param1,@param2,@param3, @param4)
@param5=sum(Money)
bankMoney where userID=""Zhangsan""
&title&Test&/title&
This is Test。
&/configuration&
代码实现如下:
namespace Demo
public class Section3 : ConfigurationSection
[ConfigurationProperty("T1", IsRequired = true)]
public MyTextElement Command1
get { return (MyTextElement)this["T1"]; }
[ConfigurationProperty("T2", IsRequired = true)]
public MyTextElement Command2
get { return (MyTextElement)this["T2"]; }
public class MyTextElement : ConfigurationElement
protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
CommandText = reader.ReadElementContentAs(typeof(string), null) as string;
protected override bool SerializeElement(XmlWriter writer, bool serializeCollectionKey)
if (writer != null)
writer.WriteCData(CommandText);
return true;
[ConfigurationProperty("data", IsRequired = false)]
public string CommandText
get { return this["data"].ToString(); }
set { this["data"] = }
这里由我们控制对数据的读写操作,也就是要重载方法SerializeElement,DeserializeElement。
4、第四种情况&&Collection
配置信息如下:
&?xml version="1.0" encoding="utf-8" ?&
&configuration&
&configSections&
&section name="Test4" type="Demo.Section4,Demo"/&
&/configSections&
&add key="1" value="aehyok"&&/add&
&add key="2" value="Leo"&&/add&
&add key="3" value="Lynn"&&/add&
&/configuration&
为每个集合中的参数项创建一个从ConfigurationElement继承的派生类,可参考Section1。
为集合创建一个从ConfigurationElementCollection继承的集合类,具体在实现时主要就是调用基类的方法。
在创建ConfigurationSection的继承类时,创建一个表示集合的属性就可以了,注意[ConfigurationProperty]的各参数。
实现代码如下:
namespace Demo
public class Section4 : ConfigurationSection
private static readonly ConfigurationProperty s_property
= new ConfigurationProperty(string.Empty, typeof(MyKeyValueCollection), null,
ConfigurationPropertyOptions.IsDefaultCollection);
[ConfigurationProperty("", Options = ConfigurationPropertyOptions.IsDefaultCollection)]
public MyKeyValueCollection KeyValues
return (MyKeyValueCollection)base[s_property];
[ConfigurationCollection(typeof(MyKeyValueSetting))]
public class MyKeyValueCollection : ConfigurationElementCollection
// 自定义一个集合
// 基本上,所有的方法都只要简单地调用基类的实现就可以了。
public MyKeyValueCollection()
: base(StringComparer.OrdinalIgnoreCase)
// 忽略大小写
// 其实关键就是这个索引器。但它也是调用基类的实现,只是做下类型转就行了。
new public MyKeyValueSetting this[string name]
return (MyKeyValueSetting)base.BaseGet(name);
// 下面二个方法中抽象类中必须要实现的。
protected override ConfigurationElement CreateNewElement()
return new MyKeyValueSetting();
protected override object GetElementKey(ConfigurationElement element)
return ((MyKeyValueSetting)element).K
// 说明:如果不需要在代码中修改集合,可以不实现Add, Clear, Remove
public void Add(MyKeyValueSetting setting)
this.BaseAdd(setting);
public void Clear()
base.BaseClear();
public void Remove(string name)
base.BaseRemove(name);
public class MyKeyValueSetting : ConfigurationElement
// 集合中的每个元素
[ConfigurationProperty("key", IsRequired = true)]
public string Key
get { return this["key"].ToString(); }
set { this["key"] = }
[ConfigurationProperty("value", IsRequired = true)]
public string Value
get { return this["value"].ToString(); }
set { this["value"] = }
读取配置文件信息
四个Read进行读取数据的代码如下:
private void button1_Click(object sender, EventArgs e)
Section1 sectioin1 = (Section1)ConfigurationManager.GetSection("Test1");
txtUserName.Text = sectioin1.UserN
txtPath.Text = sectioin1.P
private void button4_Click(object sender, EventArgs e)
Section2 sectioin2 = (Section2)ConfigurationManager.GetSection("Test2");
txtUName.Text = sectioin2.Users.UserN
txtPassword.Text = sectioin2.Users.P
private void button6_Click(object sender, EventArgs e)
Section3 section3 = (Section3)ConfigurationManager.GetSection("Test3");
T1.Text = mandText.Trim();
T2.Text = mandText.Trim();
private void button8_Click(object sender, EventArgs e)
Section4 section4 = (Section4)ConfigurationManager.GetSection("Test4");
txtKeyValues.Text = string.Join("",
( kv in section4.KeyValues.Cast&MyKeyValueSetting&()
let s = string.Format("{0}={1}", kv.Key, kv.Value)
s).ToArray());
执行点击之后数据读取如下图所示,也就是数据读取成功。
在读取自定节点时,我们需要调用ConfigurationManager.GetSection()得到配置节点,并转换成我们定义的配置节点类,然后就可以按照强类型的方式来访问了。
写入配置文件信息
&首先定义一个全局变量,代码如下
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
四个Write保存按钮如下:
private void button2_Click(object sender, EventArgs e)
Section1 sectioin1 = config.GetSection("Test1") as Section1;
sectioin1.UserName = txtUserName.T
sectioin1.Path = txtPath.T
config.Save();
private void button3_Click(object sender, EventArgs e)
Section2 sectioin2 = config.GetSection("Test2") as Section2;
sectioin2.Users.UserName = txtUName.T
sectioin2.Users.Password = txtPassword.T
config.Save();
private void button5_Click(object sender, EventArgs e)
Section3 section3 = config.GetSection("Test3") as Section3;
mandText = T1.Text.Trim();
mandText = T2.Text.Trim();
config.Save();
private void button7_Click(object sender, EventArgs e)
Section4 section4 = config.GetSection("Test4") as Section4;
section4.KeyValues.Clear();
( s in txtKeyValues.Lines
let p = s.IndexOf(""="")
where p & 0
new MyKeyValueSetting { Key = s.Substring(0, p), Value = s.Substring(p + 1) }
).ToList()
.ForEach(kv =& section4.KeyValues.Add(kv));
config.Save();
在修改配置节点前,我们需要调用ConfigurationManager.OpenExeConfiguration(),然后调用config.GetSection()在得到节点后,转成我们定义的节点类型, 然后就可以按照强类型的方式来修改我们定义的各参数项,最后调用config.Save();即可。&.net为了优化配置节点的读取操作,会将数据缓存起来,如果希望使用修改后的结果生效,您还需要调用ConfigurationManager.RefreshSection方法。如果是修改web.config,则需要使用 WebConfigurationManager。
&最终修改效果展示动态图
&1、本文主要参考大神作品/fish-li/archive//2292037.html从中学习取经。
&2、通过本文本人也学习到了很多关于配置文件的知识,之前都没有接触学习过。
&3、打算再将其他的节点设置进行学习记录下。
&4、本文示例代码链接/s/1o6JgUBg
&5、ConfigSource的使用也比较有意思,自己之前整理的一篇文章,可惜在真实项目中没用过。
&appSettings configSource="configMy.config" /&
就是关于appSettings下的配置节点都配置到了configMy.config文件中。
有关博文链接/aehyok/archive//3095019.html
阅读(...) 评论()

我要回帖

更多关于 git config 的文章

 

随机推荐