Я знаю, что этот вопрос старый, но я хотел опубликовать ответ, основанный на текущем положении дел в мире 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. Если что-то относительно этого ответа изменится, я обновлю этот ответ соответственно.