si arriva nella cache, al primo accesso di un immobile, in modo che non lette dal file fisico ogni volta che si chiede per un valore. Questo è il motivo per cui è necessario riavviare un'app Windows (o Refresh config) per ottenere il valore più recente e perché un'app ASP.Net si riavvia automaticamente quando si modifica web.config. Perché ASP.Net è cablato per riavviare è discusso nei riferimenti nella risposta How to prevent an ASP.NET application restarting when the web.config is modified.
Possiamo verificarlo utilizzando ILSpy e guardando le internals di System.Configuration:
public static NameValueCollection AppSettings
{
get
{
object section = ConfigurationManager.GetSection("appSettings");
if (section == null || !(section is NameValueCollection))
{
throw new ConfigurationErrorsException(SR.GetString("Config_appsettings_declaration_invalid"));
}
return (NameValueCollection)section;
}
}
Dapprima questo effettivamente assomigliare otterrà sezione sempre. Guardando GetSection:
public static object GetSection(string sectionName)
{
if (string.IsNullOrEmpty(sectionName))
{
return null;
}
ConfigurationManager.PrepareConfigSystem();
return ConfigurationManager.s_configSystem.GetSection(sectionName);
}
La linea critica qui è il metodo PrepareConfigSystem()
; questo inizializza un'istanza del campo IInternalConfigSystem
detenuto dal ConfigurationManager - il tipo concreto è ClientConfigurationSystem
Come parte di questo carico, viene istanziata un'istanza della classe Configuration. Questa classe è effettivamente una rappresentazione dell'oggetto del file di configurazione e sembra essere mantenuta dalla proprietà ClientConfigurationHost di ClientConfigurationSystem in un campo statico, quindi è memorizzata nella cache.
Si potrebbe verificare questa empiricamente nel modo seguente (in un'applicazione Windows Form o WPF):
- Avvio App fino
- accesso un valore in app.config
- Apportare una modifica al app.config
- controllare per vedere se il nuovo valore è presente
- chiamata
ConfigurationManager.RefreshSection("appSettings")
- controllare per vedere se il nuovo valore è presente.
In realtà, avrei potuto salvare me stesso un po 'di tempo se avessi appena letto il commento sul metodo RefreshSection :-)
/// <summary>Refreshes the named section so the next time that it is retrieved it will be re-read from disk.</summary>
/// <param name="sectionName">The configuration section name or the configuration path and section name of the section to refresh.</param>
cosa intendi con "non sempre"! questo è in base alla progettazione, ho capito che IIS riavvia l'app e ricarica la configurazione. –