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

我很困惑如何修改运行时的web.config appSettings值。 例如,我有这个appSettings部分:

<appSettings> <add key="productspagedesc" value="TODO: Edit this default message" /> <add key="servicespagedesc" value="TODO: Edit this default message" /> <add key="contactspagedesc" value="TODO: Edit this default message" /> <add key="aboutpagedesc" value="TODO: Edit this default message" /> <add key="homepagedesc" value="TODO: Edit this default message" /> </appSettings> 

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

更新:好吧,所以我在这里5年后。 我想指出的是,经验告诉我,我们不应该在web.config文件中放置任何有意在运行时编辑的configuration,而应该把它放在一个单独的XML文件中,就像下面的用户所评论的一样。 这将不需要任何编辑web.config文件重新启动应用程序,这将导致愤怒的用户打电话给你。

您需要使用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 。 这是一个布尔值,指示是否可以使用元素configuration各个页面。 如果“allowLocation”为false,则不能在单个元素中进行configuration。

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

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

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

如果你真的需要你的应用程序来编辑它自己的设置,那么你应该考虑一个不同的方法,比如数据库设置或创build一个带有可编辑设置的XML文件。

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

 <appSettings configSource="Config\appSettings.config"/> 

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

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

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

对于这种情况,这是一个更好的解决scheme(使用Visual Studio 2008进行testing):

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

我知道这个问题是旧的,但我想发布一个基于ASP.NET \ IIS世界的现状,结合我的实际经验的答案。

我最近在我的公司领导了一个项目,在那里我想整合和pipe理web.config文件中的所有appSettings&connectionStrings设置。 由于项目的成熟度和稳定性,我想要实现一种将我们的configuration设置存储在ZooKeeper中的方法。 更不要说ZooKeeper是由deviseconfiguration和集群pipe理应用程序的事实。

项目目标非常简单,

  1. 让ASP.NET与ZooKeeper进行通信
  2. 在Global.asax中,Application_Start – 从ZooKeeper中取出web.config设置。

在通过获取ASP.NET与ZooKeeper交谈的技术部分后,我很快find并用下面的代码打了一堵墙:

 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回收,一个事件日志条目应该被logging下来,而不是。

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

我应该提到,我在Windows 7上使用IIS7.5。代码将被部署到Win2012上的IIS8。 如果任何关于这个答案的变化,我会相应地更新这个答案。

谁直接喜欢这一点,

在您的configuration

  <appSettings> <add key="Conf_id" value="71" /> </appSettings> 

在你的代码(C#)

 ///SET ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue"); ///GET string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString(); 

尝试这个:

 using System; using System.Configuration; using System.Web.Configuration; namespace SampleApplication.WebConfig { public partial class webConfigFile : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Helps to open the Root level web.config file. Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~"); //Modifying the AppKey from AppValue to AppValue1 webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString"; //Save the Modified settings of AppSettings. webConfigApp.Save(); } } }