Volver a cargar la configuración sin reiniciar la aplicación usando ConfigurationManager.RefreshSection

StackOverflow https://stackoverflow.com/questions/179254

Pregunta

¿Alguien tiene esto trabajando en una aplicación web?

No importa lo que haga, parece que la sección de configuración de la aplicación (redirigida desde web.config mediante el archivo de configuración de la aplicación = ". \ Site \ site.config ") no se vuelve a cargar.

¿Estoy condenado al caso de tener que reiniciar la aplicación? Esperaba que este método me llevara a una solución más eficaz.

Actualización:

Con 'recargar' me refiero a actualizar ConfigurationManager.AppSettings sin tener que reiniciar completamente mi aplicación ASP.NET y tener que incurrir en la latencia de inicio habitual.

¿Fue útil?

Solución

Asegúrese de pasar el valor correcto de distingue entre mayúsculas y minúsculas a RefreshSection, es decir,

ConfigurationManager.RefreshSection("appSettings");

Otros consejos

Esto parece ser un defecto (tal vez un error) cuando se utiliza un archivo de configuración externo para la configuración de la aplicación. Lo he intentado usando el atributo configSource y RefreshSection simplemente nunca funciona. Supongo que esto es lo mismo cuando se usa el atributo de archivo. Si mueves la configuración de tu aplicación nuevamente dentro de tu web.config RefreshSection funcionará perfectamente pero de lo contrario me temo que estás condenado.

Por alguna razón, ConfigurationManager.RefreshSection (" appSettings ") no funcionaba para mí. Recargar el Web.Config en un objeto de Configuración parece funcionar correctamente. El siguiente código asume que el archivo Web.Config es un directorio debajo de la carpeta de ejecución (bin).

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
Uri uriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
string appPath = uriAssemblyFolder.LocalPath;
configMap.ExeConfigFilename = appPath + @"\..\" + "Web.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 

Y se usa como:

string webConfigVariable = config.AppSettings.Settings["webConfigVariable"].Value;

Como alternativa, puede escribir su propio ConfigSection y establecer restartOnExternalChanges = " false " .

Luego, al leer la sección con ConfigurationManager.GetSection (" yourSection ") , la configuración se actualizará automáticamente sin un reinicio de la aplicación .

Y podría implementar su configuración fuertemente escrita o como NameValueCollection.

.RefreshSection () no funciona cuando la configuración de la aplicación es externa.

Sin embargo, puedes usar lo siguiente para cambiar un valor:

ConfigurationManager.AppSettings.Set(key, value)

Esto NO cambiará la configuración en el archivo, solo el valor cargado en la memoria.

Entonces, en lugar de usar RefreshSection, hice lo siguiente:

string configFile="path to your config file";
XmlDocument xml = new XmlDocument();
xml.Load(configFile);

foreach (XmlNode node in xml.SelectNodes("/appSettings/add"))
{
    string key = node.Attributes["key"].Value;
    string value= node.Attributes["value"].Value;
    ConfigurationManager.AppSettings.Set(key, value);
}

Cualquier llamada posterior a AppSettings.Get contendrá el valor actualizado.

Los ajustes de la aplicación se actualizarán sin necesidad de reiniciar la aplicación.

Sí. estás atascado con iis reiniciar.

Hay una función con asp.net 4.0 e iis 7.5 donde se elimina el inicio inicial.

No estoy seguro de si esto es posible en una aplicación web, pero funciona en una aplicación de escritorio. Intente usar ConfigurationSettings en lugar de ConfigurationManager (le gritará por usar clases obsoletas ...), luego lea todos los datos en una clase. Cuando desee actualizar, simplemente cree una nueva instancia y elimine todas las referencias a la instancia anterior. Mi teoría de por qué funciona esto (podría ser incorrecta): cuando no accede directamente al archivo app.config todo el tiempo que está ejecutando, la aplicación elimina el bloqueo del archivo. Luego, se pueden realizar ediciones cuando no esté accediendo al archivo.

La configuración de App.Config se almacena en la memoria caché cuando se inicia la aplicación. Por este motivo, no creo que pueda cambiar esa configuración sin reiniciar la aplicación. Una alternativa que debería ser bastante sencilla sería crear un archivo de configuración XML simple y separado, y manejar la carga / almacenamiento en caché / recarga usted mismo.

Para escribir, llámalo de esta manera:

Dim config As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration (" ~ ")

Devolver AddOrUpdateAppSetting (config, " YourSettingKey " ;, " YourValueForTheKey ")

Para leer y asegurarse de obtener los valores en el archivo, en lugar de los de la caché, léalo de esta manera:

Dim config As System.Configuration.Configuration = WebConfigurationManager.OpenWebConfiguration("~")
  Return config.AppSettings.Settings("TheKeyYouWantTheValue").Value

Ejemplo completo:

Protected Shared Function AddOrUpdateAppSetting( _
       ByVal Config As System.Configuration.Configuration _
     , ByVal TheKey As String _
     , ByVal TheValue As String _
     ) As Boolean</p>

    Dim retval As Boolean = True

    Dim Itm As System.Configuration.KeyValueConfigurationElement = _
        Config.AppSettings.Settings.Item(TheKey)
    If Itm Is Nothing Then
        If Config.AppSettings.Settings.IsReadOnly Then
        retval = False
        Else
        Config.AppSettings.Settings.Add(TheKey, TheValue)
        End If


    Else
        ' config.AppSettings.Settings(thekey).Value = thevalue
        If Itm.IsReadOnly Then
            retval = False
        Else
            Itm.Value = TheValue
        End If


    End If
    If retval Then
     Try
        Config.Save(ConfigurationSaveMode.Modified)

     Catch ex As Exception
        retval = False
     End Try

    End If

    Return retval

End Function

¿Ha intentado almacenar sus ajustes de aplicaciones en su propio archivo externo?

Desde app.config / web.config:

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

appSettings.config:

<?xml version="1.0"?>
<appSettings>
  <add key="SomeKey" value="SomeValue" />
</appSettings>

Los cambios realizados en appSettings.config deben reflejarse instantáneamente. Más información: http://msdn.microsoft.com/en- us / library / system.configuration.sectioninformation.configsource.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top