2012-02-08 10 views
7

Quando le impostazioni di app.config vengono effettivamente lette dall'applicazione?Quando vengono effettivamente lette le impostazioni da app.config?

Supponiamo di disporre di un servizio Windows e di alcune impostazioni dell'app. Nel codice ho un metodo in cui viene utilizzata qualche impostazione. Il metodo viene chiamato in ogni iterazione, non solo una volta durante tutto il tempo. Se cambio il valore dell'impostazione tramite il file di configurazione dovrei riavviare il servizio perché venga "aggiornato" all'interno o verrà accettato la prossima volta senza alcuna interazione da parte mia?

risposta

5

È necessario chiamare il metodo ConfigurationManager.RefreshSection per leggere gli ultimi valori direttamente dal disco. Ecco un modo semplice per testare e fornire risposta alla vostra domanda:

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); 
    } 
} 

mio app.config contenente:

<?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> 

Dopo aver avviato l'applicazione, aprire l'app.config all'interno della cartella di compilazione, e cambia il valore dell'appSetting "myKey". Vedrai il nuovo valore stampato sulla console.

Per rispondere alla domanda, sì, vengono memorizzati nella cache la prima volta che vengono letti, penso, e per forzare la lettura direttamente dal disco, è necessario aggiornare la sezione.

+0

E se ottengo impostazioni come questa: Properties.Settings.Default.MyValue? – 26071986

+0

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

+0

@ 26071986 - Ho aggiornato la mia risposta per riflettere il codice relativo all'utilizzo della classe Impostazioni. – mservidio

1

O quando lo si carica tramite il Configuration Manager (ConfigurationManager.GetSection ("x/y");) o quando si tenta di accedere alle proprietà.

C'è un leggero zona grigia qui perché quando si ottiene la configurazione tramite il manager di configurazione:

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

si ottiene un oggetto di configurazione indietro se hai fornito il tipo di sezione di configurazione nell'elemento configurationSections al parte superiore del file di configurazione. Se non fornisci effettivamente la configurazione attuale, otterrai comunque un oggetto.

Tuttavia, se si dispone di un campo obbligatorio che non è impostato, non genererà un'eccezione finché non si chiama la proprietà. Ho risolto questo problema mentre provavo a testare le sezioni di configurazione personalizzate dell'unità.

Problemi correlati