Обнаружение перезагрузки appSettings в ConfigurationManager - PullRequest
0 голосов
/ 17 января 2012

мы настраиваем части приложения во время выполнения:

ConfigurationManager.AppSettings["someKey"] = "someValue";

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

  • забыли добавить этот параметр в web.configили
  • добавьте неправильные значения в их конкретные web.configs

Теперь, при некоторых обстоятельствах (то есть высоком давлении в памяти) ConfigurationManager явно сбрасывает NameValueCollection для appSettingsи перезагружает значения из файла, так что ключ / значение, добавленное нами в коде, теряется.

Это происходит иногда после того, как веб-приложение работает нормально в течение нескольких часов.Это очень редко и происходит только тогда, когда веб-приложение, кажется, находится под большой нагрузкой.

Теперь вопрос:

Есть ли способ

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

Обновление: определена причина, по которой значения сбрасываются (нагрузка на память)

Ответы [ 3 ]

0 голосов
/ 26 января 2012

Если нет причины, по которой эти добавленные вручную параметры никогда не должны быть частью конфигурации, почему бы просто не сохранить их?

ConfigurationManager.AppSettings["someKey"] = "someValue";
ConfigurationManager.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

Таким образом, даже если хеш-таблица будет удалена, значения будутперезагружен из файла конфигурации.

0 голосов
/ 26 января 2012

Решение, которое Кевин П. Райс предложил в своем комментарии, отлично подходит для этой проблемы.Здесь ответили: Есть ли способ переопределить ConfigurationManager.AppSettings?

0 голосов
/ 23 января 2012

Так как эти AppSettings предназначены для пользовательского компонента (вашего), и вы, очевидно, можете предоставить разумные значения по умолчанию, когда вам нужно, то разумный вариант для меня - не беспокоиться о том, что он будет выгружен и перезагружен. Вместо этого создайте класс-оболочку конфигурации (у вас он даже может быть), используйте его, чтобы обернуть любые вызовы AppSettings, если ключ определен, вернуть значение, в противном случае вернуть значение по умолчанию.

Не нужно беспокоиться о предотвращении / обнаружении / реакции таким образом.

...