2010-12-11 12 views
4

In einer Anwendung entwickle ich ASP.Net. In dieser Anwendung haben wir viele AppSettings verwendet. In der anfänglichen Entwicklung haben wir ConfigurationManager.AppSettings [""] verwendet. Im Laufe der Entwicklung haben wir jedoch eine Dienstprogrammklasse erstellt, in der wir für jede AppSettings eine statische Eigenschaft definieren. Dann begannen die Probleme zu kommen. Wenn jetzt die Anwendung auf dem Testserver bereitgestellt wird und wir alle Einstellungen in AppSettings ändern, hat dies keine Auswirkungen, wenn wir den IIS nicht neu starten. Hier ist das folgende Code-Snippet, mit dem ich die statische Eigenschaft von AppSettings erstelle.Das Ändern von AppSetting hat keine Auswirkungen auf die Anwendung

public static class AppSettingsUtil 
{ 
     public static string Log4Net 
     { 
      get 
      { 
       return ConfigurationManager.AppSettings["Log4Net"]; 
      } 
     } 
} 

Einer des Grundes, warum ich denken konnte, ist, dass, Es ist eine statische Eigenschaft, so dass es einmal an in seiner gesamten Lebensdauer so beim nächsten Mal initialisiert werden kann es nicht Werte aus appsettings werden kann abgerufen werden.

Antwort

10

Ich weiß, das ist ein alter Thread, aber etwas hinzuzufügen.

Wenn Sie:

<appSettings file="AppSettings.config" /> 

wechselt dann auf die externe Datei nicht verfügbar sein wird, bis eine Änderung an web.config vorgenommen wird oder ein Neustart durchgeführt wird.

Aber wenn Sie ändern, dass auf:

<appSettings configSource="AppSettings.config" /> 

Die Änderungen an diesen Einstellungen in Ihrem Code sind ab sofort ohne Neustart oder eine web.config ändern.

Ich habe gerade verifiziert, dass dies bei einem wiederholbaren Test der Fall ist.

+0

Schöne Ergänzung. Dies wird viel helfen. –

+2

Eine Sache zu beachten. Wenn Sie configSource verwenden, können Sie keine Einträge im appSettings-Bereich Ihrer web.config haben. Nur in Ihrer externen Datei. Wenn Sie den Ansatz file = verwenden, können Sie Einträge an beiden Stellen haben ... Sie müssen IIS jedoch neu starten (oder web.config ändern), damit Ihre externe Datei gelesen werden kann. –

+1

Danke für die Erklärung der "Datei" vs "ConfigSource" Bit Ed! Ich schlug auf meinen Kopf, bis ich das gefunden hatte! –

0

Statische Methoden in diesem Kontext würden den von der Konfiguration kommenden Wert niemals zwischenspeichern, ohne eines der AOP-Frameworks zu verwenden. Das wahrscheinlichere Szenario ist, dass die Site nicht kompiliert und in die Framework-Verzeichnisse verschoben wird. Persönlich möchte ich lieber die Datei Config.cs aufrufen.

3

Sie stellen die Konfigurationsdatei eindeutig bereit, da nach dem Neustart von IIS die aktualisierte Konfiguration verfügbar ist.

Es klingt wie Sie eine externe Datei für Ihre AppSettings verwenden:

<appSettings file="my-app-settings.config" /> 

Das ist gut für die Aufbewahrung web.config sauber, vor allem, wenn Sie verschiedene Konfigurationsdateien für die getrennte Umgebung (zB Entwickler, Test, prod halten). Der Haken bei diesem Ansatz ist jedoch, dass ASP.NET Änderungen an der externen Datei nicht automatisch erkennt, sodass Ihre Einstellungen nicht automatisch aktualisiert werden.

Pro MSDN, auf .NET Framework 2.0 Änderungen an der separaten Datei verursachen keine nachfolgenden Neustarts von Anwendungen. Es klingt wie Ihre Lösung sein wird, die externe Datei in diesem Szenario nicht zu verwenden.

+0

Nicht 100% korrekt, siehe meine Antwort unten. Verwenden Sie nicht das Attribut "file", sondern das Attribut "configSource". –

Verwandte Themen