【问题标题】:How do you modify the web.config appSettings at runtime?如何在运行时修改 web.config appSettings?
【发布时间】:2010-10-17 17:20:41
【问题描述】:

我对如何在运行时修改 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 文件来重新启动应用程序,这将导致愤怒的用户呼叫您。

【问题讨论】:

标签: asp.net web-config runtime


【解决方案1】:

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

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

【讨论】:

  • 您好,感谢您的回复。但是有一个“配置”类具有“保存”功能。您真的必须重新启动应用程序才能激活新设置吗?
  • 更改 web.config 会自动触发应用程序重启。
  • 不建议动态更改 web.config。我更愿意将值存储在 (xml) 文件中。
  • 有人可以解释为什么重启应用程序不好并且许多人建议将属性移动到不同的文件吗?
  • @Ben - 我知道已经有几个月了,但以防万一 - 重新启动应用程序将意味着在重新启动时登录到您的应用程序的任何人都将自动注销,并且很可能会遇到错误。 (尽管有各种场景,例如网络农场......)。愤怒的用户联系支持,支持联系你等等等等……
【解决方案2】:

你需要使用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 Modify 对 web.config 所在文件夹的访问权限。

【讨论】:

  • 感谢米奇的回复。你回答了我的问题。我所做的是以管理员身份运行 VS 2008,一切正常。
  • 也许对其他人来说很明显(对我来说不是),这个答案以及功能相同的 Amin 的答案实际上会覆盖您的物理 web.config 文件,而不仅仅是覆盖中的设置特定运行实例的内存。
【解决方案3】:

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

【讨论】:

  • 你能详细说明一下为什么它更好吗?我知道 configSection 的东西有时有点棘手。
  • 这段代码更小更易理解!至少对我来说。
  • 哦,那是因为个人口味,我还真以为逻辑上不一样。在这种情况下,我非常不同意你的观点,但实际上有很多原因:首先是因为你必须两次指定相同的键,其次是因为你所做的在语义上与实际需要的不同('update' vs 'remove-> add') 和第三个,因为代码实际上更长(不知道你为什么在这里做其他事情)并且容易出错。另外,如果由于某种原因您的代码在调用之间失败了怎么办?我认为你的应用程序从那里被破坏了。
  • 此代码删除 MyVariable 的所有注释兄弟。
  • 是的,完全正确!这段代码代码被重写所有变量,但它的工作原理。但我不推荐使用它,当你使用评论代码时。谢谢。
【解决方案4】:

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

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

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

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

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

【讨论】:

    【解决方案5】:

    我知道这个问题很老了,但我想根据 ASP.NET\IIS 世界的当前状况结合我的实际经验发布一个答案。

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

    项目目标非常简单;

    1. 让 ASP.NET 与 ZooKeeper 通信
    2. 在 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。如果有关此答案的任何内容发生变化,我将相应地更新此答案。

    【讨论】:

    • 这可能只是为我节省了几个小时。非常感谢!
    【解决方案6】:

    喜欢的人直接点,

    在您的配置中

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

    【讨论】:

    • 到品脱溶液。我签入了 WebAPI,在没有任何 IIS 安全更改的情况下在生产中工作
    【解决方案7】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 1970-01-01
      • 2016-11-04
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 2017-10-19
      • 2010-09-08
      相关资源
      最近更新 更多