Wiem, że to pytanie jest stare, ale chciałem zamieścić odpowiedź w oparciu o aktualny stan rzeczy w świecie ASP.NET \ IIS w połączeniu z moimi doświadczeniami w świecie rzeczywistym.
Niedawno prowadziłem projekt w mojej firmie, w którym chciałem skonsolidować i zarządzać wszystkimi ustawieniami appSettings i connectionStrings w naszych plikach web.config w jednym centralnym miejscu. Chciałem zastosować podejście, w którym nasze ustawienia konfiguracyjne były przechowywane w ZooKeeper ze względu na dojrzałość i stabilność projektu. Nie wspominając o tym, że ZooKeeper jest z założenia aplikacją do konfiguracji i zarządzania klastrem.
Cele projektu były bardzo proste;
- uzyskać ASP.NET do komunikacji z ZooKeeper
- w Global.asax, Application_Start - ściągnij ustawienia web.config z ZooKeepera.
Po przejściu części technicznej związanej z rozmową ASP.NET z ZooKeeperem, szybko znalazłem i uderzyłem w ścianę za pomocą następującego kodu;
ConfigurationManager.AppSettings.Add(key_name, data_value)
To stwierdzenie miało najbardziej logiczny sens, ponieważ chciałem dodać nowe ustawienia do kolekcji appSettings. Jednak, jak wspomniano w oryginalnym plakacie (i wielu innych), to wywołanie kodu zwraca błąd stwierdzający, że kolekcja jest tylko do odczytu.
Po przeprowadzeniu trochę badań i zobaczeniu różnych szalonych sposobów, w jakie ludzie radzili sobie z tym problemem, byłem bardzo zniechęcony. Zamiast się poddać lub poprzestać na tym, co wydawało się być mało idealnym scenariuszem, zdecydowałem się zagłębić i sprawdzić, czy czegoś mi brakuje.
Po kilku próbach i błędach stwierdziłem, że następujący kod zrobi dokładnie to, co chciałem;
ConfigurationManager.AppSettings.Set(key_name, data_value)
Korzystając z tej linii kodu, mogę teraz załadować wszystkie 85 kluczy appSettings z ZooKeeper w moim Application_Start.
Jeśli chodzi o ogólne stwierdzenia dotyczące zmian w pliku web.config powodujących ponowne uruchomienie usług IIS, zmodyfikowałem następujące ustawienia puli aplikacji, aby monitorować sytuację za kulisami;
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Przy takiej kombinacji ustawień, jeśli ten proces miałby spowodować ponowne odtworzenie puli aplikacji, wpis w dzienniku zdarzeń powinien zostać zarejestrowany, a nie był.
To prowadzi mnie do wniosku, że ładowanie ustawień aplikacji ze scentralizowanego nośnika pamięci jest możliwe i rzeczywiście bezpieczne.
Powinienem wspomnieć, że używam IIS7.5 w systemie Windows 7. Kod zostanie wdrożony w IIS8 na Win2012. Jeśli cokolwiek w tej odpowiedzi ulegnie zmianie, odpowiednio zaktualizuję tę odpowiedź.