Как вы изменяете appSettings 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 во время выполнения?
ОБНОВЛЕНИЕ: Хорошо, вот и я 5 лет спустя. Я хотел бы отметить, что опыт подсказал мне, что мы не должны помещать любую конфигурацию, которая намеренно редактируется во время выполнения, в файл web.config, но вместо этого мы должны поместить ее в отдельный XML-файл, как это прокомментировал один из пользователей ниже. Это не потребует какого-либо редактирования файла web.config для перезапуска приложения, что приведет к тому, что злые пользователи будут звонить вам.
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 в machine.config. Это логическое значение, которое указывает, можно ли настроить отдельные страницы с помощью элемента. Если "allowLocation" имеет значение false, его нельзя настроить в отдельных элементах.
Наконец, имеет значение, если вы запускаете свое приложение в IIS и запускаете тестовый образец из Visual Studio. Идентификацией процесса ASP.NET является учетная запись IIS, ASPNET или NETWORK SERVICES (в зависимости от версии IIS).
Может потребоваться предоставление ASPNET или сетевых услуг. Изменить доступ к папке, в которой находится web.config.
Изменение web.config обычно вызывает перезапуск приложения.
Если вам действительно нужно, чтобы ваше приложение отредактировало свои собственные настройки, вам следует рассмотреть другой подход, такой как создание базы данных настроек или создание XML-файла с редактируемыми настройками.
И если вы хотите избежать перезапуска приложения, вы можете удалить appSettings
раздел:
<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 =>
Протестировано в 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 в наших файлах 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. Если что-то относительно этого ответа изменится, я обновлю этот ответ соответственно.
Кто любит прямо в точку,
В вашей конфигурации
<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();
}
}
}