当前位置:  开发笔记 > 后端 > 正文

如何在运行时修改web.config appSettings?

如何解决《如何在运行时修改web.configappSettings?》经验,为你挑选了5个好方法。

我对如何在运行时修改web.config appSettings值感到困惑.例如,我有这个appSettings部分:


  
  
  
  
  
 

比方说,我想在运行时修改"homepagedesc"键.我尝试了ConfigurationManager和WebConfigurationManager静态类,但设置是"只读".如何在运行时修改appSettings值?

更新:好的,所以我在这里5年后.我想指出经验告诉我,我们不应该在web.config文件中放置任何故意在运行时可编辑的配置,而是应该将它放在一个单独的XML文件中,就像下面的用户之一所述.这将不需要任何编辑web.config文件来重新启动应用程序,这将导致愤怒的用户呼叫您.



1> Mitch Wheat..:

您需要使用WebConfigurationManager.OpenWebConfiguration():例如:

Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")
myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text
myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text
myConfiguration.Save()

我想你可能还需要在machine.config中设置AllowLocation.这是一个布尔值,指示是否可以使用该元素配置单个页面.如果"allowLocation"为false,则无法在单个元素中配置它.

最后,如果您在IIS中运行应用程序并从Visual Studio运行测试示例,则会有所不同.ASP.NET进程标识是IIS帐户,ASPNET或NETWORK SERVICES(取决于IIS版本).

可能需要授予ASPNET或NETWORK SERVICES修改web.config所在文件夹的访问权限.



2> Joel..:

更改web.config通常会导致应用程序重新启动.

如果您确实需要应用程序来编辑自己的设置,那么您应该考虑使用不同的方法,例如数据库设置或使用可编辑设置创建xml文件.


更改web.config会自动触发应用程序重新启动.

3> Ciprian Teio..:

如果您想避免重新启动应用程序,可以移出以下appSettings部分:


到一个单独的文件.并结合使用ConfigurationSaveMode.Minimal

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.Save(ConfigurationSaveMode.Minimal);

您可以继续使用该appSettings部分作为存储进行各种设置,而不会导致应用程序重新启动,也无需使用格式与普通appSettings部分不同的文件.



4> Amin Ghaderi..:

2012 这是针对此场景的更好解决方案(使用Visual Studio 2008测试):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
config.AppSettings.Settings.Remove("MyVariable");
config.AppSettings.Settings.Add("MyVariable", "MyValue");
config.Save();

更新2018 =>
在vs 2015中测试 - Asp.net MVC5

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
config.Save();

如果你需要检查元素是否存在,请使用以下代码:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
if (config.AppSettings.Settings["MyVariable"] != null)
{
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
}
else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); }
config.Save();


哦,这是因为个人品味,我实际上认为它在某种程度上在逻辑上是不同的.在这种情况下,我非常不同意你的观点,尽管实际上有很多原因:首先是因为你必须指定两次相同的密钥,其次是因为你所做的是在语义上与实际需要的不同('update'vs'remove->添加')和第三,因为代码实际上更长(不知道为什么你不在这里),并开放出错.此外,如果由于某种原因你的代码在调用之间失败怎么办?我认为你的申请是从那里打破的.
此代码删除了对MyVariable的任何评论.

5> Sage..:

我知道这个问题已经过时了,但我想根据ASP.NET\IIS世界中的当前状态结合我的实际经验发布答案.

我最近在我的公司带头开展了一个项目,我希望在一个中心位置整合和管理web.config文件中的所有appSettings和connectionStrings设置.我想采用一种方法,我们的配置设置存储在ZooKeeper中,因为项目的成熟度和稳定性.更不用说ZooKeeper在设计上是一个配置和集群管理应用程序.

项目目标非常简单;

    让ASP.NET与ZooKeeper进行通信

    在Global.asax中,Application_Start - 从ZooKeeper中提取web.config设置.

在获得ASP.NET与ZooKeeper交谈的技术部分后,我很快找到并使用以下代码打了一个墙;

ConfigurationManager.AppSettings.Add(key_name, data_value)

由于我想在appSettings集合中添加新设置,因此该声明具有最合理的意义.但是,正如原始海报(以及许多其他人)所提到的,此代码调用返回一个错误,指出该集合是只读的.

在做了一些研究并看到人们解决这个问题的各种疯狂方式后,我非常沮丧.我没有放弃或解决看似不太理想的情况,而是决定深入研究,看看我是否遗漏了一些东西.

经过一些试验和错误,我发现以下代码完全符合我的要求;

ConfigurationManager.AppSettings.Set(key_name, data_value)

使用这行代码,我现在可以在Application_Start中从ZooKeeper加载所有85个appSettings键.

关于有关更改web.config触发IIS回收的一般声明,我编辑了以下appPool设置来监视幕后的情况;

appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True

使用这些设置组合,如果此过程导致appPool回收,则应记录事件日志条目,而不是.

这使我得出结论,从集中存储介质加载应用程序设置是可能的,而且确实是安全的.

我应该提一下,我在Windows 7上使用IIS7.5.代码将在Win2012上部署到IIS8.如果有关此答案的任何内容发生变化,我将相应地更新此答案.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有