¿Cómo se modifican los ajustes de la aplicación web.config en tiempo de ejecución?

Estoy confundido sobre cómo modificar los valores de web.config appSettings en tiempo de ejecución. Por ejemplo, tengo esta sección AppSettings:

       

Digamos que quiero modificar la clave “homepagedesc” en el tiempo de ejecución. Intenté las clases estáticas de ConfigurationManager y WebConfigurationManager, pero las configuraciones son de “solo lectura”. ¿Cómo modifico los valores de appSettings en tiempo de ejecución?

ACTUALIZACIÓN: Ok, entonces aquí estoy 5 años después. Me gustaría señalar que la experiencia me ha dicho que no deberíamos poner ninguna configuración que intencionalmente sea editable en tiempo de ejecución en el archivo web.config, sino que deberíamos colocarlo en un archivo XML separado como lo que uno de los usuarios comentó a continuación. Esto no requerirá ninguna edición del archivo web.config para reiniciar la aplicación que resultará con usuarios molestos que lo llamen.

Necesita usar WebConfigurationManager.OpenWebConfiguration() : Por ejemplo:

 Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~") myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text myConfiguration.Save() 

Creo que también podría necesitar establecer AllowLocation en machine.config . Este es un valor booleano que indica si las páginas individuales se pueden configurar con el elemento. Si “allowLocation” es falso, no se puede configurar en elementos individuales.

Finalmente, hace una diferencia si ejecuta su aplicación en IIS y ejecuta su muestra de prueba desde Visual Studio. La identidad del proceso ASP.NET es la cuenta IIS, ASPNET o SERVICIOS DE RED (según la versión de IIS).

Es posible que deba otorgar ASPNET o SERVICIOS DE RED Modifique el acceso en la carpeta donde reside web.config.

El cambio de web.config generalmente provoca el reinicio de una aplicación.

Si realmente necesita que su aplicación edite su propia configuración, entonces debe considerar un enfoque diferente, como los datos basados ​​en la configuración o la creación de un archivo xml con la configuración editable.

Y si desea evitar el reinicio de la aplicación, puede salir de la sección de appSettings la appSettings :

  

a un archivo separado. Y en combinación con ConfigurationSaveMode.Minimal

 var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); config.Save(ConfigurationSaveMode.Minimal); 

puede continuar utilizando la sección de appSettings la appSettings como la tienda para varias configuraciones sin causar reinicios de la aplicación y sin la necesidad de utilizar un archivo con un formato diferente al de la sección de configuración de la aplicación normal.

2012 Esta es una mejor solución para este escenario (probado con Visual Studio 2008 ):

 Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); config.AppSettings.Settings.Remove("MyVariable"); config.AppSettings.Settings.Add("MyVariable", "MyValue"); config.Save(); 

Actualización 2018 =>
Probado en vs 2015 – Asp.net MVC5

 var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); config.AppSettings.Settings["MyVariable"].Value = "MyValue"; config.Save(); 

si necesita que el elemento de verificación exista, use este código:

 var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); if (config.AppSettings.Settings["MyVariable"] != null) { config.AppSettings.Settings["MyVariable"].Value = "MyValue"; } else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); } config.Save(); 

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 donde 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 donde nuestra configuración de configuración se almacenara 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 administración de configuración y clúster.

Los objectives del proyecto fueron muy simples;

  1. obtener ASP.NET para comunicarse con ZooKeeper
  2. en Global.asax, Application_Start – extrae la configuración de web.config desde ZooKeeper.

Al pasar la parte técnica de obtener ASP.NET para hablar con ZooKeeper, rápidamente encontré y choqué contra una pared con el siguiente código;

 ConfigurationManager.AppSettings.Add(key_name, data_value) 

Esa statement tuvo el sentido más lógico ya que quería AGREGAR nuevas configuraciones a la colección appSettings. Sin embargo, como se mencionó en el cartel 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 hacer un poco de investigación y ver todas las diferentes maneras locas en que las personas trabajaron en torno a este problema, me sentí muy desanimado. En lugar de darme por vencido 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 yo quería;

 ConfigurationManager.AppSettings.Set(key_name, data_value) 

Al usar esta línea de código, ahora puedo cargar todas las 85 claves de AppSettings desde ZooKeeper en mi Application_Start.

Con respecto a las declaraciones generales sobre los cambios en web.config que activan los reciclados de IIS, edité las siguientes configuraciones de la apppool para supervisar 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 causara un reciclaje de appPool, se debería haber registrado una entrada de Registro de eventos, que no era.

Esto me lleva a concluir que es posible, y de hecho seguro, cargar una configuración de aplicaciones 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 en relación con esta respuesta cambia, actualizaré esta respuesta en consecuencia.

A quién le gusta directamente al punto,

En tu configuración

     

en tu código (c #)

 ///SET ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue"); ///GET string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString(); 

Prueba esto:

 using System; using System.Configuration; using System.Web.Configuration; namespace SampleApplication.WebConfig { public partial class webConfigFile : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Helps to open the Root level web.config file. Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~"); //Modifying the AppKey from AppValue to AppValue1 webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString"; //Save the Modified settings of AppSettings. webConfigApp.Save(); } } }