Подтвердить что ты не робот

Перезагрузка конфигурации без перезапуска приложения с помощью ConfigurationManager.RefreshSection

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

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

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

Update:

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

4b9b3361

Ответ 2

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

Ответ 3

По какой-то причине 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;

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Возврат AddOrUpdateAppSetting (config, "YourSettingKey", "YourValueForKey" )

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

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

Ответ 10

Вы пытались хранить свои 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