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

Я запутался в том, как изменить значения параметров web.config appSettings во время выполнения. Например, у меня есть этот раздел appSettings:

       

Предположим, я хочу изменить ключ «homepagedesc» во время выполнения. Я пробовал статические classы ConfigurationManager и WebConfigurationManager, но настройки «только для чтения». Как изменить значения appSettings во время выполнения?

ОБНОВЛЕНИЕ: Хорошо, так вот я через 5 лет. Я хотел бы отметить, что опыт сказал мне, мы не должны указывать какую-либо конфигурацию, которая преднамеренно редактируется во время выполнения в файле web.config, но вместо этого мы должны поместить ее в отдельный файл 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() 

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

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

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

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

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

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

      

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

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

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

    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 =>
    Протестировано против 2015 года – Asp.net MVC5

     var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); config.AppSettings.Settings["MyVariable"].Value = "MyValue"; config.Save(); 

    если u необходимо проверить элемент существует, используйте этот код:

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

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

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

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

    1. получить ASP.NET для связи с ZooKeeper
    2. в 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. Если что-либо изменит этот ответ, я соответствующим образом обновлю ответ.

    Кто любит прямо к делу,

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

         

    в вашем коде (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(); } } } 
    Давайте будем гением компьютера.