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.
Um den Kerl, der meine Tags bearbeitet. Das hat nichts mit ASP.Net zu tun. Mein Servicehost ist eine Konsolenanwendung. –
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