Ответ 1
Убедитесь, что вы передаете правильное значение значение, чувствительное к регистру для RefreshSection, т.е.
ConfigurationManager.RefreshSection("appSettings");
Кто-нибудь получил эту работу в веб-приложении?
Независимо от того, что я делаю, кажется, что мой раздел appSettings (перенаправленный из web.config с помощью файла appSettings = ".\Site\site.config" ) не перезагружается.
Неужели я обречен на случай перезапуска приложения? Я надеялся, что этот метод приведет меня к более эффективному решению.
Update:
Под "перезагрузкой" я имею в виду обновление настроек ConfigurationManager.AppSettings без необходимости полностью перезапуска приложения ASP.NET и необходимости выполнять обычную задержку запуска.
Убедитесь, что вы передаете правильное значение значение, чувствительное к регистру для RefreshSection, т.е.
ConfigurationManager.RefreshSection("appSettings");
Это, кажется, недостаток (возможно, ошибка) при использовании внешнего файла конфигурации для ваших приложений. Я пробовал это с помощью атрибута configSource, и RefreshSection просто никогда не работает, я предполагаю, что это то же самое при использовании атрибута файла. ReflexSection будет работать отлично, но в противном случае я боюсь, что вы обречены.
По какой-то причине 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;
В качестве альтернативы вы можете написать свой собственный ConfigSection
и установить restartOnExternalChanges="false"
.
Затем при чтении раздела с ConfigurationManager.GetSection("yourSection")
настройки будут автоматически обновляться без перезапуска приложения.
И вы можете реализовать свои настройки строго типизированные или как NameValueCollection.
.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 будут содержать обновленное значение.
Затем настройки приложения будут обновлены без необходимости перезапуска приложения.
Да. вы застряли в перезапуске iis.
Существует функция с asp.net 4.0 и iis 7.5, где начальный запуск удаляется.
Я не уверен, что это возможно в веб-приложении, но оно работает в настольном приложении. Попробуйте использовать ConfigurationSettings, а не ConfigurationManager (он будет кричать на вас для использования устаревших классов...), а затем считывать все данные в класс. Когда вы хотите обновить, просто создайте новый экземпляр и оставьте все ссылки на старый экземпляр. Моя теория о том, почему это работает (может быть, и не так): когда вы не получаете прямого доступа к файлу app.config все время, когда вы запускаете, блокировка файла отбрасывается приложением. Затем редактирование может быть выполнено, когда вы не получаете доступ к файлу.
Настройки App.Config хранятся в кеше в памяти при запуске приложения. По этой причине я не думаю, что вы сможете изменить эти настройки без перезапуска приложения. Одной из альтернатив, которая должна быть довольно прямой, было бы создание отдельного простого XML файла конфигурации и обработка загрузки/кэширования/перезагрузки его самостоятельно.
Чтобы написать, назовите его так:
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
Вы пытались хранить свои 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