Sé que esta pregunta es antigua, pero quería publicar una respuesta basada en el estado actual de las cosas en el mundo ASP.NET \ IIS combinado con mi experiencia en el mundo real.
Recientemente encabecé un proyecto en mi empresa en el que quería consolidar y administrar todas las configuraciones de appSettings y connectionStrings en nuestros archivos web.config en un lugar central. Quería seguir un enfoque en el que nuestras configuraciones de configuración se almacenaran en ZooKeeper debido a la madurez y estabilidad de los proyectos. Sin mencionar el hecho de que ZooKeeper es por diseño una aplicación de configuración y administración de clústeres.
Los objetivos del proyecto eran muy simples;
- obtener ASP.NET para comunicarse con ZooKeeper
- en Global.asax, Application_Start: extraiga la configuración web.config de ZooKeeper.
Tras aprobar la pieza técnica de hacer que ASP.NET hable con ZooKeeper, rápidamente encontré y choqué contra una pared con el siguiente código;
ConfigurationManager.AppSettings.Add(key_name, data_value)
Esa declaración tenía el sentido más lógico ya que quería AGREGAR nuevas configuraciones a la colección appSettings. Sin embargo, como mencionó el póster original (y muchos otros), esta llamada de código devuelve un error que indica que la colección es de solo lectura.
Después de investigar un poco y ver todas las diferentes formas locas en que la gente solucionó este problema, estaba muy desanimado. En lugar de rendirme o conformarme con lo que parecía ser un escenario menos que ideal, decidí indagar y ver si me estaba perdiendo algo.
Con un poco de prueba y error, encontré que el siguiente código haría exactamente lo que quería;
ConfigurationManager.AppSettings.Set(key_name, data_value)
Con esta línea de código, ahora puedo cargar las 85 claves de configuración de aplicaciones de ZooKeeper en mi Application_Start.
Con respecto a las declaraciones generales sobre los cambios en web.config que desencadenan el reciclaje de IIS, edité la siguiente configuración de appPool para monitorear la situación detrás de escena;
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Con esa combinación de configuraciones, si este proceso provocara un reciclaje de appPool, debería haberse registrado una entrada en el Registro de eventos, lo cual no fue así.
Esto me lleva a concluir que es posible, y de hecho seguro, cargar la configuración de una aplicación desde un medio de almacenamiento centralizado.
Debo mencionar que estoy usando IIS7.5 en Windows 7. El código se implementará en IIS8 en Win2012. Si algo con respecto a esta respuesta cambia, actualizaré esta respuesta en consecuencia.