So che questa domanda è vecchia, ma volevo pubblicare una risposta basata sullo stato attuale delle cose nel mondo ASP.NET \ IIS combinato con la mia esperienza nel mondo reale.
Di recente ho guidato un progetto presso la mia azienda in cui volevo consolidare e gestire tutte le impostazioni di appSettings e connectionStrings nei nostri file web.config in un'unica posizione centrale. Volevo perseguire un approccio in cui le nostre impostazioni di configurazione fossero memorizzate in ZooKeeper a causa della maturità e stabilità dei progetti. Per non parlare del fatto che ZooKeeper è in base alla progettazione un'applicazione per la gestione della configurazione e dei cluster.
Gli obiettivi del progetto erano molto semplici;
- ottenere ASP.NET per comunicare con ZooKeeper
- in Global.asax, Application_Start - estrae le impostazioni web.config da ZooKeeper.
Dopo aver superato la parte tecnica per convincere ASP.NET a parlare con ZooKeeper, ho rapidamente trovato e colpito un muro con il codice seguente;
ConfigurationManager.AppSettings.Add(key_name, data_value)
Questa affermazione aveva il senso più logico poiché volevo AGGIUNGERE nuove impostazioni alla raccolta appSettings. Tuttavia, come menzionato nel poster originale (e in molti altri), questa chiamata di codice restituisce un errore che indica che la raccolta è di sola lettura.
Dopo aver fatto un po 'di ricerca e visto tutti i diversi modi folli in cui le persone hanno risolto questo problema, ero molto scoraggiato. Invece di arrendermi o accontentarmi di quello che sembrava uno scenario tutt'altro che ideale, ho deciso di scavare e vedere se mi mancava qualcosa.
Con un po 'di tentativi ed errori, ho scoperto che il seguente codice avrebbe fatto esattamente quello che volevo;
ConfigurationManager.AppSettings.Set(key_name, data_value)
Utilizzando questa riga di codice, ora sono in grado di caricare tutte le 85 chiavi appSettings da ZooKeeper nel mio Application_Start.
Per quanto riguarda le dichiarazioni generali sulle modifiche a web.config che attivano i ricicli di IIS, ho modificato le seguenti impostazioni di appPool per monitorare la situazione dietro le quinte;
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Con questa combinazione di impostazioni, se questo processo dovesse causare un riciclo di appPool, dovrebbe essere registrata una voce del registro eventi, cosa che non è stata.
Questo mi porta a concludere che è possibile, e in effetti sicuro, caricare le impostazioni di un'applicazione da un supporto di memorizzazione centralizzato.
Devo dire che sto usando IIS7.5 su Windows 7. Il codice verrà distribuito su IIS8 su Win2012. Se qualcosa riguardante questa risposta cambia, aggiornerò questa risposta di conseguenza.