2009-04-06 10 views
73

Я смущен тем, как изменять значения параметров приложения Web.config во время выполнения. Например, у меня есть этот AppSettings раздел:Как вы изменяете настройки приложения web.config во время выполнения?

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

+0

Вот хорошая ссылка, которая прекрасно объясняет, как модифицировать web.config a t время выполнения и его влияние в приложении. [http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html](http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at- runtime.html) – 2010-05-13 22:34:01

+5

@ user330004 указанная вами ссылка более недействительна – McArthey

+0

Для поиска [архивной версии] (http://web.archive.org/web/20111217082254/http://aspdotnethacker) требуется всего несколько секунд. blogspot.com/2010/05/modify-webconfig-file-at-runtime.html)! – stuartd

ответ

75

Вы должны использовать 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. Измените доступ к папке, где находится web.config.

+1

Спасибо за ответ Митч. Вы ответили на мой вопрос. То, что я сделал, я запускал VS 2008 как Администратор, и все было в порядке. – jerbersoft

22

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

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

+1

Привет, спасибо за ответ. Но есть этот класс «Конфигурация», который имеет функцию «Сохранить». Вам действительно нужно перезапустить приложение, чтобы новые настройки были активными? – jerbersoft

+4

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

+1

Динамическое изменение web.config не рекомендуется. Я бы предпочел сохранить значение в файле (xml). –

16

Это лучшее решение для этого сценария (проверено с Visual Studio 2008):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); 
config.AppSettings.Settings.Remove("MyVariable"); 
config.AppSettings.Settings.Add("MyVariable", "MyValue"); 
config.Save(); 

Update +2018 =>
Испытано в 2015 году против - Asp.net MVC5

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

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

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

Не могли бы вы немного объяснить, почему это лучше? Я знаю, что содержимое configSection иногда немного сложно. – julealgon

+0

Этот код меньше и понятнее! По крайней мере, для меня. –

+3

О, это из-за личного вкуса, тогда я на самом деле думал, что это было логически иначе. Я очень не согласен с вами в этом случае, хотя для кучи причин на самом деле: сначала, потому что вам нужно указать один и тот же ключ дважды, второй, потому что то, что вы делаете, семантически отличается от того, что на самом деле необходимо («update» vs «remove-> add ') и третий, потому что код на самом деле длиннее (не уверен, почему вы здесь что-то здесь) и открываете для ошибок. Кроме того, что, если по какой-то причине ваш код не работает между вызовами? Я думаю, ваше заявление нарушено. – julealgon

21

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

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

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

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

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

11

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

Недавно я возглавил проект в своей компании, где хотел объединить и управлять всеми настройками connectionStrings appSettings & в наших файлах 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. Если что-либо изменит этот ответ, я соответствующим образом обновлю ответ.

+0

Это, вероятно, просто спасло меня несколько часов. Спасибо! –

+0

Добро пожаловать. – Sage

2

Кто любит непосредственно к точке,

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

<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

Попробуйте:

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(); 
     } 
    } 
} 
Смежные вопросы