2010-03-03 8 views
5

ich in der App.Config unsere Servicehost zur Laufzeit und es lag versuchen den Namen der Datenbank in der Connectionstring zu ändern neu starten danach in einer anderen Datenbank zu verbinden. Dies funktioniert, aber nur, wenn die Anwendung für mehrere Sekunden heruntergefahren wird. Das Herunterfahren der Anwendung für einige Sekunden scheint den Cache des ConfigurationManager.Connectionstrings zu löschen. Das Problem ist, dass ich aufgrund dieser erforderlichen Abschaltzeit Application.Restart() in meiner Anwendung nicht verwenden kann.Wie kann ich deaktivieren Sie das configuration Cache für connection

Das Merkwürdige an diesem Caching-Verhalten ist, dass der aktualisierte Wert auch dann korrekt angezeigt wird, wenn der Wert im Speicher aktualisiert wird (im Beispiel das zweite Mal, wenn er angefordert wird). Aber wenn die Anwendung neu gestartet wird, scheint der alte Wert erneut zu entstehen.

Um das Verhalten zu überprüfen, erstellen Sie eine neue Konsolenanwendung.

hinzufügen ein App.Config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
    <add name="DomainDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=InitialDBName;Integrated Security=SSPI;" /> 
    </connectionStrings> 
</configuration> 

fügen Sie dann den folgenden Code in die Main-Methode

 ConfigurationManager.RefreshSection("connectionStrings"); 
     DbConnectionStringBuilder builder = new DbConnectionStringBuilder(); 
     Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     builder.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString; 

     //print initial value 
     Console.WriteLine("initial " + (string)builder["Initial Catalog"]); 

     //change value 
     builder["Initial Catalog"] = "ChangedDatabaseName"; 
     appConfig.ConnectionStrings.ConnectionStrings.Remove("DomainDBConnectionString"); 
     appConfig.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings("DomainDBConnectionString", builder.ConnectionString)); 
     appConfig.ConnectionStrings.SectionInformation.ForceSave = true; 
     appConfig.Save(ConfigurationSaveMode.Full); 
     ConfigurationManager.RefreshSection("connectionStrings"); 

     Console.ReadLine(); 

     DbConnectionStringBuilder builder2 = new DbConnectionStringBuilder(); 
     Configuration appConfig2 = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     builder2.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString; 
     Console.WriteLine("changed " + (string)builder2["Initial Catalog"]); 

     Console.ReadLine(); 

zu reproduzieren dieses Verhalten Datei, müssen Sie die Anwendung auszuführen (von F5 Schlagen) und Schließe es. Anschließend wird die Datei solutionsname.exe.config mit dem geänderten Wert angezeigt. Wenn Sie die Anwendung ein zweites Mal ausführen (dieses Mal durch Doppelklicken auf solutionsname.exe), werden Sie den Unterschied im Verhalten bemerken, wenn Sie dies sofort nach dem Beenden Ihrer Anwendung tun, oder nachdem Sie ein paar Sekunden gewartet haben.

Meiner Meinung nach sollte die configsection wegen ConfigurationManager.RefreshSection wieder gelesen werden („connection“); aber offensichtlich funktioniert das nicht wie beworben.

+0

Um den Kerl, der meine Tags bearbeitet. Das hat nichts mit ASP.Net zu tun. Mein Servicehost ist eine Konsolenanwendung. –

+1

Fair genug, aber es ist immer noch.net - das Risiko, nicht Fragen richtig Tagging ist, dass andere Leute es für Sie etikettieren, und sie werden es falsch :) – skaffman

Antwort

0

Das Problem scheint in der Tatsache, dass das erste Mal zu wohnen, ich die Anwendung von Visual Studio laufen (mit Debugger aktiviert ist).

Wenn ich die Anwendung aus dem ist/Debug-Verzeichnis des Cache-Problem scheint nicht ausgeführt zu existieren.

Für meine Produktionsumgebung wird dies mein Problem beheben (also mein Problem ist behoben). Dies jedoch tötet meine Neugierde an der Ursache des Verhaltensunterschiedes nicht.

9

2 Dinge:

Erst wenn Sie im Debug-Modus nicht solutionname.exe.config verwenden; Sie verwenden tatsächlich solutionname.vshost.exe.config, also warum Ihr inkonsistentes Verhalten, weil die solutionname.vshost.exe.config Datei auf die ursprüngliche Version zurückgeht, sobald Sie die Anwendung beenden; Änderungen, die Sie daran vorgenommen haben, verlieren.

Sekunden diese Codezeile ConfigurationManager.RefreshSection("connectionStrings"); funktioniert nicht immer wie erwartet. Ich habe festgestellt, dass es manchmal besser ist, den übergeordneten Abschnitt oder die Abschnittsgruppe zu aktualisieren. in diesem Fall wäre "Konfiguration".

versuchen so ConfigurationManager.RefreshSection("configuration");

+0

ConfigurationManage.RefreshSection („Konfiguration“) nicht für mich helfen ... ich um dieses arbeitete von mit Application.Restart() nach (wird in 2 Instanzen gestartet PS Beachten sie, dass Application.Restart() aufgerufen werden muss, von Program.Main() sonst nach dem Neustart Anwendung) Änderungen in der Konfigurations sparend – Prokurors

+0

ich habe festgestellt, dass es leider unmöglich ist, führe RefreshSection auf "configuration" aus. – SondreB

Verwandte Themen