2012-02-08 17 views
7

¿Cuándo la aplicación lee realmente la configuración de app.config?¿Cuándo se lee realmente la configuración de app.config?

Supongamos que tengo un servicio de Windows y algunas configuraciones de la aplicación para él. En el código, tengo un método donde se usa alguna configuración. El método se llama en cada iteración, no solo una vez durante todo el tiempo. Si cambio el valor de configuración a través del archivo de configuración ¿debo reiniciar el servicio para que se "actualice" en el interior o se aceptará la próxima vez sin ninguna interacción de mi parte?

Respuesta

5

Debe llamar al método ConfigurationManager.RefreshSection para obtener los últimos valores leídos directamente del disco. Aquí está una manera simple de probar y dar respuesta a su pregunta:

static void Main(string[] args) 
{ 
    while (true) 
    { 
     // There is no need to restart you application to get latest values. 
     // Calling this method forces the reading of the setting directly from the config. 
     ConfigurationManager.RefreshSection("appSettings"); 
     Console.WriteLine(ConfigurationManager.AppSettings["myKey"]); 

     // Or if you're using the Settings class. 
     Properties.Settings.Default.Reload(); 
     Console.WriteLine(Properties.Settings.Default.MyTestSetting); 

     // Sleep to have time to change the setting and verify. 
     Thread.Sleep(10000); 
    } 
} 

Mi app.config que contiene:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="ConsoleApplication2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
    </sectionGroup> 
    </configSections> 
    <appSettings> 
    <add key="myKey" value="Original Value"/> 
    </appSettings> 
    <userSettings> 
    <ConsoleApplication2.Properties.Settings> 
     <setting name="MyTestSetting" serializeAs="String"> 
     <value>Original Value</value> 
     </setting> 
    </ConsoleApplication2.Properties.Settings> 
    </userSettings> 
</configuration> 

Después de iniciar la aplicación, abra el app.config dentro de la carpeta de compilación, y cambie el valor de la aplicaciónConfigurando "myKey". Verá el nuevo valor impreso en la consola.

Para responder a la pregunta, sí, se almacenan en la memoria caché la primera vez que se leen, creo, y para forzar la lectura directamente desde el disco, debe actualizar la sección.

+0

Y si obtengo una configuración como esta: Properties.Settings.Default.MyValue? – 26071986

+0

usando Properties.Settings.Default.Reload(); – mservidio

+0

@ 26071986 - He actualizado mi respuesta para reflejar el código cuando se usa la clase Configuración. – mservidio

1

O bien cuando lo carga mediante el administrador de configuración (ConfigurationManager.GetSection ("x/y");) o cuando intenta acceder a las propiedades.

Hay una ligera zona gris porque cuando se obtiene la configuración a cabo a través del gestor de configuración:

var config = (MyConfigSection)ConfigurationManager.GetSection("MyConfigSection"); 

Usted recibe un objeto de configuración de vuelta si usted ha proporcionado el tipo de sección de configuración en el elemento configurationSections en el parte superior del archivo de configuración. Si realmente no proporciona la configuración real, todavía obtendrá un objeto de nuevo.

Sin embargo, si tiene un campo obligatorio que no está configurado, no arrojará una excepción hasta que llame al establecimiento. He resuelto esto al intentar probar mis secciones de configuración personalizadas.

Cuestiones relacionadas