Es wird beim ersten Zugriff auf eine Eigenschaft zwischengespeichert, sodass es nicht jedes Mal aus der physischen Datei gelesen wird, wenn Sie nach einem Wert fragen. Aus diesem Grunde ist es notwendig , eine Windows - Anwendung (oder neu zu starten Aktualisieren der config) den neuesten Wert zu erhalten, und warum eine ASP.Net app werden automatisch neu gestartet , wenn Sie bearbeiten web.config. Warum ASP.Net für einen Neustart fest verdrahtet ist, wird in den Referenzen in der Antwort erläutert . So verhindern Sie, dass eine ASP.NET-Anwendung neu gestartet wird, wenn die web.config geändert wird .
Wir können dies mit ILSpy überprüfen und uns die Interna von System.Configuration ansehen:
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;
}
}
Auf den ersten Blick sieht es tatsächlich so aus, als würde es jedes Mal den Abschnitt bekommen. GetSection betrachten:
public static object GetSection(string sectionName)
{
if (string.IsNullOrEmpty(sectionName))
{
return null;
}
ConfigurationManager.PrepareConfigSystem();
return ConfigurationManager.s_configSystem.GetSection(sectionName);
}
Die kritische Linie hier ist die PrepareConfigSystem()
Methode; Dadurch wird eine Instanz des IInternalConfigSystem
vom ConfigurationManager gehaltenen Felds initialisiert - der konkrete Typ istClientConfigurationSystem
Im Rahmen dieses Ladevorgangs wird eine Instanz der Konfigurationsklasse instanziiert. Diese Klasse ist effektiv eine Objektdarstellung der Konfigurationsdatei und scheint von der ClientConfigurationHost-Eigenschaft des ClientConfigurationSystems in einem statischen Feld gehalten zu werden - daher wird sie zwischengespeichert.
Sie können dies empirisch testen, indem Sie Folgendes tun (in einer Windows Form- oder WPF-App):
- Starten Sie Ihre App
- Greifen Sie auf einen Wert in app.config zu
- Nehmen Sie eine Änderung an app.config vor
- Überprüfen Sie, ob der neue Wert vorhanden ist
- Anruf
ConfigurationManager.RefreshSection("appSettings")
- Überprüfen Sie, ob der neue Wert vorhanden ist.
Tatsächlich hätte ich mir etwas Zeit sparen können, wenn ich nur den Kommentar zur RefreshSection- Methode gelesen hätte :-)
var file = new FileInfo(@"\\MyConfigFilePath\Web.config"); DateTime first = file.LastAccessTime; string fn = ConfigurationManager.AppSettings["FirstName"]; Thread.Sleep(2000); DateTime second = file.LastAccessTime; string sn = ConfigurationManager.AppSettings["Surname"]; Thread.Sleep(2000); DateTime third = file.LastAccessTime;
Alle zeigen dieselbe LastAccessTime an, was bedeutet, dass sie beim Start zwischengespeichert wird.
string fn1 = ConfigurationManager.AppSettings["FirstName"]; Thread.Sleep(2000); DateTime fourth = file.LastAccessTime;
quelle