Как вы изменяете app.ettings web.config во время выполнения? - PullRequest
82 голосов
/ 06 апреля 2009

Я не уверен, как изменить значения 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 для перезапуска приложения, в результате чего злые пользователи будут звонить вам.

Ответы [ 7 ]

81 голосов
/ 06 апреля 2009

Вам необходимо использовать 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» имеет значение false, его нельзя настроить в отдельных элементах.

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

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

24 голосов
/ 06 апреля 2009

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

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

23 голосов
/ 11 декабря 2014

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

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

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

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

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

19 голосов
/ 08 августа 2012

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

если вам нужно проверить наличие элемента, используйте этот код:

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();
12 голосов
/ 06 июня 2016

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

3 голосов
/ 16 февраля 2017

Кто любит прямо в точку,

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

    <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();
0 голосов
/ 27 июня 2017

Попробуйте:

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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...