当前位置:  编程技术>.net/c#/asp.net

基于动态修改App.Config与web.Config的使用详解

    来源: 互联网  发布时间:2014-10-20

    本文导语:  首先假设你的应用程序配置文件如下: 代码如下:         Ok,那么如何在运行时去修改name的值呢?? 有很多童鞋会说可以使用Xml读取配置文件,然后xxx。。。。 当然这种方法肯定可以解决问题,有没有其他方法呢?...

首先假设你的应用程序配置文件如下:

代码如下:

 

   

 



Ok,那么如何在运行时去修改name的值呢??

有很多童鞋会说可以使用Xml读取配置文件,然后xxx。。。。

当然这种方法肯定可以解决问题,有没有其他方法呢??

在这里我要介绍一种比较简单的方法,可能已经有人知道了,那就是使用ConfigurationManager类

ConfigurationManager 存在System.Configuration.dll 中。

代码如下:

代码如下:

public static void Main()
{
    Console.WriteLine(ConfigurationManager.AppSettings["name"]);
    ChangeConfiguration();
    Console.WriteLine(ConfigurationManager.AppSettings["name"]);
    Console.ReadLine();
}

private static void ChangeConfiguration()
{
    //读取程序集的配置文件
    string assemblyConfigFile = Assembly.GetEntryAssembly().Location;

    Configuration config = ConfigurationManager.OpenExeConfiguration(assemblyConfigFile);
    //获取appSettings节点
    AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
   

    //删除name,然后添加新值
    appSettings.Settings.Remove("name");
    appSettings.Settings.Add("name", "new");

    //保存配置文件
    config.Save();
}


代码很简单:首先读取配置文件,接着获取appSettings节点,然后修改,接着保存。

运行:结果如下:

可以看到输出的值是两个old.

为什么??

查找msdn文档可以发现微软出于性能考虑,对ConfigurationManager采用了缓存策略,所以如果要读取新的值,应该使用ConfigurationManager的RefreshSection来进行刷新,

ConfigurationManager . RefreshSection:

刷新命名节,这样在下次检索它时将从磁盘重新读取它。

于是将Main方法修改为:

Console.WriteLine(ConfigurationManager.AppSettings["name"]);

ChangeConfiguration();

ConfigurationManager.RefreshSection("appSettings");

Console.WriteLine(ConfigurationManager.AppSettings["name"]);

重新清理解决方案,重新运行:

可以看到,仍然是两个old。。。

为什么??  

难道值没有修改??,我们打开应用程序的配置文件,可以通过监视assemblyConfigFile获得路径

上面是xxxbinDebugCAStudy.exe.,对应的配置文件就是CAStudy.exe.config

文件的内容如下:

 

可以发现value 值已经更改,那么为什么输出还是old,old 呢??

 

为了验证不是VS2010的问题。

首先手动将CAStudy.exe.config 文件中的value改为”old”,接着再次运行CAStudy.exe 结果如下:

 

可以看到输出时old,和new。为什么会这样???

难道调试时读取的不是修改的配置文件,或者修改的配置文件并不是调试的应用程序读取的文件??

在assemblyConfigFile 中设置断点,可以发现assemblyConfigFile 读取的是CAStudy.exe.Config。但是vs调试的时候运行的是CAStudy.vshost.exe。也就是说我们使用ConfigurationManager.OpenExeConfiguration 打开的是CAStudy.exe.config文件,但是我们调试的应用程序CAStudy.vshost.exe使用的是CAStudy.vshost.exe.config文件。

那么还有其他的方式可以准确的获取应用程序配置文件吗??

有的,使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

将ChangeConfiguration()方法修改如下:

代码如下:

private static void ChangeConfiguration()
{

    //读取程序集的配置文件
    string assemblyConfigFile = Assembly.GetEntryAssembly().Location;
    string appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
   

     //获取appSettings节点
    AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
   

    //删除name,然后添加新值
    appSettings.Settings.Remove("name");
    appSettings.Settings.Add("name", "new");

    //保存配置文件
    config.Save();
}


清理,重新运行:

使用默认的不传递字符串的版本就可以打开当前配置文件了。

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

如果要查看当前配置文件的完整路径可以使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

重新运行,结果如下:

 

另外值得一提的是:ConfigurationManager.RefreshSection 不支持section Group.所以对于WCF的服务,你必须一个一个的RefreshSection:

ConfigurationManager.RefreshSection("system.serviceModel/behaviors");

ConfigurationManager.RefreshSection("system.serviceModel/bindings");

ConfigurationManager.RefreshSection("system.serviceModel/client");

ConfigurationManager.RefreshSection("system.serviceModel/services");


    
 
 

您可能感兴趣的文章:

  • C++的静态联编和动态联编详解
  • mysql存储过程 在动态SQL内获取返回值的方法详解
  • VC6.0如何创建以及调用动态链接库实例详解
  • DHCP:解析开发板上动态获取ip的2种实现方法详解
  • Asp.net动态生成html页面的实例详解
  • 深入理解C++的动态绑定与静态绑定的应用详解
  • java jdk动态代理详解
  • java代理模式与动态代理模式详解
  • Oracle静态注册与动态注册详解
  • jsp中include指令静态导入和动态导入的区别详解
  • Python调用C/C++动态链接库的方法详解
  • WEB前端 iis7站长之家
  • 深入探讨Linux静态库与动态库的详解(一看就懂)
  • Java动态代理的应用详解
  • java动态代理详解
  • Servlet动态网页技术详解
  • C#动态创建组件、属性及事件方法详解
  • 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何动态修改层(<div ....> </div>)的显示与否?
  • 如何修改Linux动态库的依赖?
  • 解决ie动态修改link样式,import css不刷新的问题
  • 紧急求助:如何动态修改某个选中jTree节点的节点名称。
  • ubuntu下修改 vim 配置 将 .inc 后缀文件 动态当作不同文件对待的解决办法
  • 按照如下方法定义一个表格,我该如何动态的修改表格(如添加行和列,applet)
  • 动态给表添加删除字段并同时修改它的插入更新存储过程
  • jQuery动态改变图片显示大小(修改版)的实现思路及代码
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 可执行程序加载动态库 和 动态库加载动态库 的动态库初始化的问题
  • Linux下c函数dlopen实现加载动态库so文件代码举例
  • 动态库调用动态库
  • linux动态链接库里全局变量和静态变量会导致动态库不可重入吗?
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • 关于动态菜单项,注意,不是动态菜单(一定给分)
  • Linux下,怎么确定动态库的绝对位置(动态库里面确定)?
  • 为什么动态生成的图片,JSP不能动态的获得
  • 请问:能不能动态的运行时生成对象(动态定义对象), 要涉及到哪些技术, 反射,序列化...??
  • 动态加载动态库问题--在线等
  • C#实现动态显示及动态移除图片方法
  • 静态库,动态库,静态链接和动态链接
  • 在linux下(c++),如何动态调用 动态库(.so)? 为什么我编译报错:undefined reference to "dlopen"
  • 程序发布的问题(动态连接库的问题)
  • JSP动态缓存 JimStoneCache
  • 怎么调试unix动态库.
  • 如何调用动态
  • 动态编译与静态编译驱动程式疑问?
  • 关于动态库的问题,谢谢!
  • linux动态路由问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3