Перезагрузка конфигурации без перезапуска приложения с использованием ConfigurationManager.RefreshSection - PullRequest
37 голосов
/ 07 октября 2008

Кто-нибудь получил это работает в веб-приложении?

Независимо от того, что я делаю, кажется, что мой раздел appSettings (перенаправленный из web.config с помощью appSettings file = ". \ Site \ site.config") не перезагружается.

Обречен ли я на случай перезапуска приложения? Я надеялся, что этот метод приведет меня к более эффективному решению.

Обновление:

Под «перезагрузкой» я подразумеваю обновление ConfigurationManager.AppSettings без необходимости полностью перезапускать мое приложение ASP.NET и нести обычную задержку при запуске.

Ответы [ 10 ]

47 голосов
/ 20 октября 2009

Убедитесь, что вы передаете правильное значение с учетом регистра в RefreshSection, т.е.

ConfigurationManager.RefreshSection("appSettings");
13 голосов
/ 01 декабря 2008

Это кажется недостатком (возможно, ошибкой) при использовании внешнего файла конфигурации для ваших настроек приложения. Я пробовал это с использованием атрибута configSource и RefreshSection просто никогда не работает, я предполагаю, что это то же самое при использовании атрибута файла. Если вы переместите ваши appSettings обратно в ваш web.config, RefreshSection будет работать отлично, но в противном случае, я боюсь, вы обречены.

4 голосов
/ 05 марта 2013

По какой-то причине ConfigurationManager.RefreshSection("appSettings") не работал для меня. Перезагрузка Web.Config в объект конфигурации, кажется, работает правильно. В следующем коде предполагается, что файл Web.Config находится в одном каталоге под исполняемой папкой (bin).

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
Uri uriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
string appPath = uriAssemblyFolder.LocalPath;
configMap.ExeConfigFilename = appPath + @"\..\" + "Web.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 

И используется как:

string webConfigVariable = config.AppSettings.Settings["webConfigVariable"].Value;
3 голосов
/ 13 декабря 2011

В качестве альтернативы вы можете написать свой ConfigSection и установить restartOnExternalChanges="false".

Тогда при чтении раздела с ConfigurationManager.GetSection("yourSection") настройки будут автоматически обновляться без перезапуска приложения .

И вы могли бы реализовать свои настройки строго типизированные или как NameValueCollection.

1 голос
/ 06 января 2017

.RefreshSection () не работает, когда appSettings является внешним.

Однако вы можете использовать следующее для изменения значения:

ConfigurationManager.AppSettings.Set(key, value)

Это НЕ изменит настройки файла, только загруженное значение в памяти.

Поэтому вместо RefreshSection я сделал следующее:

string configFile="path to your config file";
XmlDocument xml = new XmlDocument();
xml.Load(configFile);

foreach (XmlNode node in xml.SelectNodes("/appSettings/add"))
{
    string key = node.Attributes["key"].Value;
    string value= node.Attributes["value"].Value;
    ConfigurationManager.AppSettings.Set(key, value);
}

Любые последующие вызовы AppSettings.Get будут содержать обновленное значение.

Затем appSettings будут обновлены без перезапуска приложения.

0 голосов
/ 16 июня 2010

Я не уверен, возможно ли это в веб-приложении, но оно работает в настольном приложении. Попробуйте использовать ConfigurationSettings, а не ConfigurationManager (он будет кричать на вас за использование устаревших классов ...), а затем прочитать все данные в класс. Когда вы хотите обновить, просто создайте новый экземпляр и отбросьте все ссылки на старый экземпляр. Моя теория о том, почему это работает (может быть неверно): когда вы не обращаетесь напрямую к файлу app.config в течение всего времени работы, приложение снимает блокировку файла. Затем можно внести изменения, когда у вас нет доступа к файлу.

0 голосов
/ 17 мая 2010

Да. вы застряли с перезапуском iis.

В asp.net 4.0 и iis 7.5 есть функция, которая удаляет первоначальный запуск.

0 голосов
/ 07 апреля 2010

Вы пытались сохранить свои AppSettings в своем внешнем файле?

Из app.config / web.config:

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

appSettings.config:

<?xml version="1.0"?>
<appSettings>
  <add key="SomeKey" value="SomeValue" />
</appSettings>

Изменения, внесенные в appSettings.config, должны быть отражены немедленно. Больше информации: http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx

0 голосов
/ 30 января 2009

Чтобы написать, назовите это так:

Dim config As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration ("~")

Return AddOrUpdateAppSetting (config, "YourSettingKey", "YourValueForTheKey")

Чтобы прочитать и убедиться, что вы получаете значения в файле, а не в кэше, прочитайте его так:

Dim config As System.Configuration.Configuration = WebConfigurationManager.OpenWebConfiguration("~")
  Return config.AppSettings.Settings("TheKeyYouWantTheValue").Value

Полный пример:

Protected Shared Function AddOrUpdateAppSetting( _
       ByVal Config As System.Configuration.Configuration _
     , ByVal TheKey As String _
     , ByVal TheValue As String _
     ) As Boolean</p>

    Dim retval As Boolean = True

    Dim Itm As System.Configuration.KeyValueConfigurationElement = _
        Config.AppSettings.Settings.Item(TheKey)
    If Itm Is Nothing Then
        If Config.AppSettings.Settings.IsReadOnly Then
        retval = False
        Else
        Config.AppSettings.Settings.Add(TheKey, TheValue)
        End If


    Else
        ' config.AppSettings.Settings(thekey).Value = thevalue
        If Itm.IsReadOnly Then
            retval = False
        Else
            Itm.Value = TheValue
        End If


    End If
    If retval Then
     Try
        Config.Save(ConfigurationSaveMode.Modified)

     Catch ex As Exception
        retval = False
     End Try

    End If

    Return retval

End Function
0 голосов
/ 07 октября 2008

Настройки App.Config кэшируются в памяти при запуске приложения. По этой причине я не думаю, что вы сможете изменить эти настройки без перезапуска приложения. Альтернативой, которая должна быть довольно простой, было бы создание отдельного простого файла конфигурации XML и выполнение загрузки / кэширования / перезагрузки самостоятельно.

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