Es wird zwischengespeichert, beim ersten Zugriff einer Immobilie, so dass es nicht von der physischen Datei jedes Mal, wenn Sie für einen Wert lesen fragen. Aus diesem Grund ist es notwendig, eine Windows-App (oder Refresh die Konfig) neu zu starten, um den neuesten Wert zu erhalten, und warum eine ASP.Net-Anwendung beim Bearbeiten von web.config automatisch neu gestartet wird. Warum ASP.Net zum Neustart fest verdrahtet ist, wird in den Referenzen in der Antwort How to prevent an ASP.NET application restarting when the web.config is modified diskutiert.
Wir können auf die Interna von System.Configuration dies mit ILSpy und auf der Suche überprüfen:
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;
}
}
Zunächst dies in der Tat sieht wie es jedes Mal, wenn der Abschnitt erhalten. Mit Blick auf GetSection:
public static object GetSection(string sectionName)
{
if (string.IsNullOrEmpty(sectionName))
{
return null;
}
ConfigurationManager.PrepareConfigSystem();
return ConfigurationManager.s_configSystem.GetSection(sectionName);
}
Die kritische Linie ist hier die PrepareConfigSystem()
Methode; Dies initialisiert eine Instanz des Feldes IInternalConfigSystem
des ConfigurationManagers - der konkrete Typ ist ClientConfigurationSystem
Als Teil dieses Ladens wird eine Instanz der Klasse Configuration instanziiert. Diese Klasse ist effektiv eine Objektdarstellung der Konfigurationsdatei und wird anscheinend von der ClientConfigurationHost-Eigenschaft des ClientConfigurationSystems in einem statischen Feld gehalten - daher wird sie zwischengespeichert.
Sie könnten dies empirisch testen, indem Sie die folgenden Schritte (in einem Windows Form oder WPF-Anwendung):
- Starten Sie Ihre App bis
- Zugriff Wert in app.config
- Eine Änderung an app.config
- überprüfen Sie, ob der neue Wert
ConfigurationManager.RefreshSection("appSettings")
- überprüfen Sie, ob der neue Wert vorhanden
- Call ist zu sehen, ist anwesend.
In der Tat, ich selbst könnte einige Zeit gespeichert, wenn ich nur den Kommentar auf der RefreshSection Methode :-)
/// <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>
was meinst du mit "nicht immer"! das ist von Entwurf Ich habe verstanden, dass IIS die App neu startet und die Konfiguration neu lädt. –