Я знаю, что это старый вопрос, но я хотел опубликовать ответ, основанный на текущем состоянии дел в мире ASP.NET \ IIS в сочетании с моим реальным опытом.
Недавно я возглавил проект в своей компании, в котором я хотел объединить и управлять всеми настройками appSettings и connectionStrings в наших файлах web.config в одном центральном месте. Я хотел реализовать подход, при котором наши настройки конфигурации хранились в ZooKeeper из-за зрелости и стабильности этого проекта. Не говоря уже о том факте, что ZooKeeper является приложением для управления конфигурацией и кластером.
Цели проекта были очень простыми;
- заставить ASP.NET общаться с ZooKeeper
- в 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. Если что-то в этом ответе изменится, я соответствующим образом обновлю этот ответ.