Как вы изменяете настройки приложения web.config во время выполнения?

Я смущен тем, как изменять значения appSettings для web.config во время выполнения. Например, у меня есть этот раздел 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 во время выполнения?

UPDATE: Хорошо, так вот я через 5 лет. Я хотел бы отметить, что опыт сказал мне, мы не должны указывать какую-либо конфигурацию, которая преднамеренно редактируется во время выполнения в файле web.config, но вместо этого мы должны поместить ее в отдельный файл XML, как то, что один из пользователей прокомментировал ниже. Это не потребует какого-либо редактирования файла web.config для перезапуска приложения, которое будет вызвано тем, что вас зовут сердитые пользователи.

Ответ 1

Вам нужно использовать 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()

Я думаю, вам также может потребоваться установить AllowLocation в machine.config. Это логическое значение, указывающее, можно ли настроить отдельные страницы с помощью элемента. Если "allowLocation" является ложным, его нельзя настроить в отдельных элементах.

Наконец, имеет значение, если вы запускаете свое приложение в IIS и запускаете свой тестовый образец из Visual Studio. Идентификатором процесса ASP.NET является учетная запись IIS, службы ASPNET или NETWORK (в зависимости от версии IIS).

Возможно, вам необходимо предоставить ASPNET или NETWORK SERVICES Изменить доступ к папке, где находится web.config.

Ответ 2

Изменение web.config обычно приводит к перезапуску приложения.

Если вам действительно нужно ваше приложение для редактирования собственных параметров, вы должны рассмотреть другой подход, например, установить базу данных или создать файл xml с редактируемыми настройками.

Ответ 3

И если вы хотите избежать перезагрузки приложения, вы можете выйти из раздела appSettings:

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

в отдельный файл. И в сочетании с ConfigurationSaveMode.Minimal

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

вы можете продолжать использовать раздел appSettings в качестве хранилища для различных параметров без перезапуска приложения и без использования файла с другим форматом, чем обычный раздел appSettings.

Ответ 4

Это лучшее решение для этого сценария (проверено с помощью Visual Studio 2008):

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

Ответ 5

Я знаю, что этот вопрос старый, но я хотел опубликовать ответ, основанный на текущем состоянии дел в мире ASP.NET\IIS, в сочетании с моим опытом в реальном мире.

Недавно я возглавил проект в своей компании, где я хотел объединить и управлять всеми параметрами appSettings и connectionStrings в наших файлах web.config в одном центральном месте. Я хотел продолжить подход, когда наши настройки конфигурации были сохранены в ZooKeeper из-за зрелости и стабильности проектов. Не говоря уже о том, что ZooKeeper представляет собой приложение для управления конфигурацией и кластером.

Цели проекта были очень простыми:

  • получить связь ASP.NET с ZooKeeper
  • в Global.asax, Application_Start - вытащите настройки web.config из ZooKeeper.

После получения технической части, чтобы заставить ASP.NET разговаривать с ZooKeeper, я быстро нашел и ударил стену с помощью следующего кода:

ConfigurationManager.AppSettings.Add(key_name, data_value)

Это утверждение было наиболее логичным, поскольку я хотел добавить новые настройки в коллекцию appSettings. Однако, как упоминал оригинальный плакат (и многие другие), этот кодовый вызов возвращает сообщение об ошибке, указывающее, что коллекция доступна только для чтения.

Проведя немного исследований и увидев все безумные способы, которыми люди работали над этой проблемой, я был очень обескуражен. Вместо того, чтобы отказаться от того, что казалось менее реалистичным сценарием, я решил вскочить и посмотреть, не хватает ли я чего-то.

С небольшим количеством проб и ошибок я обнаружил, что следующий код будет делать именно то, что я хотел;

ConfigurationManager.AppSettings.Set(key_name, data_value)

Используя эту строку кода, теперь я могу загрузить все 85 ключей appSettings из ZooKeeper в свой Application_Start.

Что касается общих утверждений об изменениях в 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, запись журнала событий должна быть записана, а это не так.

Это позволяет мне сделать вывод о том, что возможно и действительно безопасно загружать настройки приложений с централизованного носителя данных.

Я должен упомянуть, что я использую IIS7.5 для Windows 7. Этот код будет развернут в IIS8 на Win2012. Если что-либо изменит этот ответ, я соответствующим образом обновлю ответ.

Ответ 6

Кому нравится прямо к делу,

В вашей конфигурации

    <appSettings>

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

  </appSettings>

в вашем коде (С#)

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

Ответ 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();
        }
    }
}