87

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

4

7 回答 7

85

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

于 2009-04-06T00:26:12.703 回答
25

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

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

于 2009-04-06T00:22:19.060 回答
24

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

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

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

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

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

于 2014-12-11T13:32:42.090 回答
21

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();
于 2012-08-08T06:31:36.363 回答
16

我知道这个问题很老,但我想根据 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。如果有关此答案的任何内容发生变化,我将相应地更新此答案。

于 2016-06-06T12:46:51.510 回答
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();
于 2017-02-16T12:34:36.410 回答
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();
        }
    }
}
于 2017-06-27T11:20:12.150 回答