Bu sorunun eski olduğunu biliyorum, ancak ASP.NET \ IIS dünyasındaki mevcut durumu ve gerçek dünya deneyimimi birleştirerek bir yanıt göndermek istedim.
Kısa bir süre önce şirketimde, web.config dosyalarımızdaki tüm appSettings & connectionStrings ayarlarını tek bir merkezi yerde konsolide etmek ve yönetmek istediğim bir projeye öncülük ettim. Olgunluk ve istikrar projelerinden dolayı yapılandırma ayarlarımızın ZooKeeper'da depolandığı bir yaklaşım benimsemek istedim. ZooKeeper'ın tasarım gereği bir yapılandırma ve küme yönetimi uygulaması olduğundan bahsetmiyorum bile.
Proje hedefleri çok basitti;
- ZooKeeper ile iletişim kurmak için ASP.NET edinin
- Global.asax içinde, Application_Start - ZooKeeper'dan web.config ayarlarını çekin.
ZooKeeper ile konuşmak için ASP.NET'i edinmenin teknik parçasını geçtikten sonra, hızlı bir şekilde aşağıdaki kodla bir duvara çarptım ve çarptım;
ConfigurationManager.AppSettings.Add(key_name, data_value)
Bu ifade, appSettings koleksiyonuna yeni ayarlar EKLEMEK istediğim için en mantıklı olanıydı. Ancak, orijinal göndericinin (ve diğerlerinin) bahsettiği gibi, bu kod çağrısı, koleksiyonun Salt Okunur olduğunu belirten bir Hata döndürür.
Biraz araştırma yaptıktan ve insanların bu problem etrafında çalıştığı tüm farklı çılgın yolları gördükten sonra, çok cesaretim kırıldı. İdealden daha az görünen senaryodan vazgeçmek ya da razı olmak yerine, kazmaya ve bir şeyi kaçırıp kaçırmadığımı görmeye karar verdim.
Biraz deneme yanılma ile aşağıdaki kodun tam olarak istediğimi yapacağını buldum;
ConfigurationManager.AppSettings.Set(key_name, data_value)
Bu kod satırını kullanarak artık ZooKeeper'daki 85 appSettings anahtarının tamamını Application_Start'ıma yükleyebiliyorum.
IIS geri dönüşümlerini tetikleyen web.config değişiklikleriyle ilgili genel ifadelerle ilgili olarak, perde arkasındaki durumu izlemek için aşağıdaki appPool ayarlarını düzenledim;
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Bu ayar kombinasyonuyla, eğer bu işlem bir appPool geri dönüşümüne neden olacaksa, bir Olay Günlüğü girişi kaydedilmelidir, ki bu kayıt olmamalıdır.
Bu beni, merkezi bir depolama ortamından bir uygulama ayarını yüklemenin mümkün ve gerçekten güvenli olduğu sonucuna götürüyor.
Windows 7'de IIS7.5 kullandığımı belirtmeliyim. Kod, Win2012'de IIS8'e konuşlandırılacak. Bu cevapla ilgili herhangi bir değişiklik olursa, bu cevabı buna göre güncelleyeceğim.