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

时间:2009-04-06 00:14:47

标签: asp.net web-config runtime

我对如何在运行时修改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文件中放置任何故意在运行时可编辑的配置,而是应该将它放在一个单独的XML文件中,就像下面的用户之一所述。这不需要任何编辑web.config文件来重新启动应用程序,这将导致愤怒的用户呼叫你。

7 个答案:

答案 0 :(得分:81)

您需要使用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所在文件夹的访问权限。

答案 1 :(得分:24)

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

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

答案 2 :(得分:23)

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

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

到一个单独的文件。并与ConfigurationSaveMode.Minimal

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

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

答案 3 :(得分:19)

<强> 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 =&gt;
在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();

答案 4 :(得分:12)

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

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

项目目标非常简单;

  1. 让ASP.NET与ZooKeeper进行通信
  2. Global.asax中的
  3. ,Application_Start - 从ZooKeeper中提取web.config设置。
  4. 在获得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。如果有关此答案的任何内容发生变化,我将相应地更新此答案。

答案 5 :(得分:3)

谁直接喜欢这一点,

在您的配置

    <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();

答案 6 :(得分:0)

试试这个:

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();
        }
    }
}