2009-04-06 16 views
73

No estoy seguro de cómo modificar los valores de web.config appSettings en tiempo de ejecución. Por ejemplo, tengo esta sección appsettings:¿Cómo se modifican los ajustes de la aplicación web.config en tiempo de ejecución?

<appSettings> 
    <add key="productspagedesc" value="TODO: Edit this default message" /> 
    <add key="servicespagedesc" value="TODO: Edit this default message" /> 
    <add key="contactspagedesc" value="TODO: Edit this default message" /> 
    <add key="aboutpagedesc" value="TODO: Edit this default message" /> 
    <add key="homepagedesc" value="TODO: Edit this default message" /> 
</appSettings> 

Digamos, quiero modificar la clave "homepagedesc" en 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: Bien, 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.

+0

Aquí es una un buen enlace que bien explica sobre la modificación de la web.config a t tiempo de ejecución y su impacto en la aplicación. [http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html](http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at- runtime.html) –

+5

@ user330004 el enlace que proporcionó ya no es válido – McArthey

+0

Solo lleva unos segundos encontrar la [versión archivada] (http://web.archive.org/web/20111217082254/http://aspdotnethacker. blogspot.com/2010/05/modify-webconfig-file-at-runtime.html)! – stuartd

Respuesta

75

Es necesario utilizar 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 es posible que también tenga que configurar 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).

Podría ser necesario otorgar ASPNET o servicios de red Modificar el acceso en la carpeta donde reside web.config.

+1

Gracias por la respuesta Mitch. Usted respondió mi pregunta. Lo que hice fue ejecutar VS 2008 como administrador y todo iba bien. – jerbersoft

22

Al cambiar el archivo web.config generalmente se reinicia la aplicación.

Si realmente necesita que su aplicación edite su propia configuración, entonces debería considerar un enfoque diferente como, por ejemplo, la base de datos o la creación de un archivo xml con la configuración editable.

+1

Hola, gracias por la respuesta. Pero existe esta clase de "Configuración" que tiene una función de "Guardar". ¿Realmente tiene que reiniciar la aplicación para que la nueva configuración esté activa? – jerbersoft

+4

Al cambiar el archivo web.config se activa automáticamente el reinicio de una aplicación. –

+1

No se debe recomendar cambiar web.config dinámicamente. Preferiría almacenar el valor en un archivo (xml). –

16

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 t o elemento de comprobación de existir, utilice 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(); 
+0

¿Podría explicar un poco por qué es mejor? Sé que configSection a veces es un poco complicado. – julealgon

+0

¡Este código es más pequeño y más comprensible! Al menos para mí. –

+3

Oh, es por gusto personal, de hecho pensé que era lógicamente diferente de alguna manera. No estoy muy de acuerdo con usted en este caso, aunque sí por un montón de razones: primero porque debe especificar la misma clave dos veces, segundo porque lo que está haciendo es semánticamente diferente de lo que realmente se necesita ('actualizar' frente a 'eliminar-> add ') y tercero porque el código es realmente más largo (no estoy seguro de por qué te ocurre lo contrario aquí) y abierto a errores. Además, ¿qué ocurre si por alguna razón su código falla entre las llamadas? Su aplicación está rota a partir de ahí, creo. – julealgon

21

Y si se quiere evitar el reinicio de la aplicación, se puede mover la sección appSettings:

<appSettings configSource="Config\appSettings.config"/> 

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

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

se puede seguir utilizando la sección appSettings como la tienda para diversas configuraciones sin causar reinicia la aplicación y sin la necesidad de utilizar un archivo con un formato diferente al de la sección appsettings normal.

11

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 he encabezado un proyecto en mi empresa en el que quería consolidar y gestionar todas las configuraciones de configuración de la aplicación & ConnectionStrings en nuestros archivos web.config en un lugar central. Quería seguir un enfoque donde nuestras configuraciones de configuración se almacenan en ZooKeeper debido a que los proyectos maduran & estabilidad. Sin mencionar el hecho de que ZooKeeper es, por diseño, una configuración & aplicación de administración de clúster.

Los objetivos del proyecto eran muy simples;

  1. get ASP.NET para comunicarse con ZooKeeper
  2. en Global.asax, Application_Start - tire de configuración web.config de ZooKeeper.

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

ConfigurationManager.AppSettings.Add(key_name, data_value) 

Esa declaración tiene 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 investigar un poco y ver las diferentes maneras locas en que las personas trabajaban 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 quería;

ConfigurationManager.AppSettings.Set(key_name, data_value) 

Usando esta línea de código, ahora soy capaz de cargar los 85 AppSettings teclas de ZooKeeper en mi Application_Start.

En cuanto a las declaraciones generales acerca de 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 las escenas;

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 ajustes, si este proceso fueron para causar un reciclaje AppPool, una entrada de registro de sucesos debería haber ser grabada, que no lo 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.

+0

Esto probablemente me haya salvado unas pocas horas. ¡Muchas gracias! –

+0

De nada. – Sage

2

quién le gusta directamente al punto,

En su configuración

<appSettings> 

    <add key="Conf_id" value="71" /> 

    </appSettings> 

en el código (C#)

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

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(); 
     } 
    } 
} 
Cuestiones relacionadas