Как вы изменяете веб.config appSettings во время выполнения?



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

839   7  

7 ответов:

вы должны использовать 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 в машине.конфиг. Это логическое значение, которое указывает, можно ли настроить отдельные страницы с помощью элемента. Если" allowLocation " имеет значение false, его нельзя настроить в отдельных элементах.

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

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

изменение сети.конфигурация, как правило, приводит к перезапустить приложение.

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

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

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

в отдельный файл. И в сочетании с 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 =>
протестировано в 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();

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

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

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

  1. получить ASP.NET для общения с ZooKeeper
  2. в глобальном.asax, Application_Start-pull web.настройки конфигурации от ZooKeeper.

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

ConfigurationManager.AppSettings.Add(key_name, data_value)

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

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

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

ConfigurationManager.AppSettings.Set(key_name, data_value)

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

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

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. Должно ли что-нибудь относительно этого ответа измените, я обновлю этот ответ соответственно.

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

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

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

Попробуйте Это:

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

Comments

    Ничего не найдено.