Я знаю, що це питання давнє, але я хотів опублікувати відповідь на основі поточного стану справ у світі 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 клавіш налаштувань додатків із 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. Якщо щось щодо цієї відповіді зміниться, я відповідно оновлю цю відповідь.