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