J'essaie de changer le nom de la base de données dans la chaîne de connexion située dans le App.Config de notre servicehost au moment de l'exécution et de le relancer ensuite en me connectant à une autre base de données. Cela fonctionne correctement, mais seulement si l'application est arrêtée pendant plusieurs secondes. Arrêter l'application pendant plusieurs secondes semble effacer le cache des ConfigurationManager.Connectionstrings. Le problème est qu'en raison de ce temps d'arrêt requis, je ne peux pas utiliser Application.Restart() dans mon application. La chose étrange à propos de ce comportement de mise en cache est que même lorsque la valeur est mise à jour dans la mémoire (dans l'exemple la deuxième fois, il est demandé) la valeur mise à jour est affichée correctement. Mais lorsque l'application est redémarrée, l'ancienne valeur semble réapparaître.comment puis-je effacer le cache de configurationmanager pour les chaînes de connexion
Pour vérifier le comportement, créez une nouvelle application de console.
ajouter un fichier 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>
puis ajoutez le code suivant à la méthode principale
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();
Pour reproduire ce problème, vous devez exécuter l'application (en appuyant sur F5) et Ferme le. ensuite le fichier solutionname.exe.config apparaîtra avec la valeur modifiée. Si vous exécutez l'application une seconde fois (cette fois en double-cliquant sur la solutionname.exe), vous remarquerez la différence de comportement si vous le faites immédiatement après la fin de votre application, ou après avoir attendu quelques secondes. À mon avis, la configuration doit être relue à cause de ConfigurationManager.RefreshSection ("connectionStrings"); mais apparenatelly cela ne fonctionne pas comme annoncé.
Pour le gars qui a édité mes tags. Cela n'a rien à voir avec ASP.Net. Mon servicehost est une application console. –
Assez bien, mais c'est encore.net - le risque de ne pas étiqueter les questions correctement est que d'autres personnes vont le marquer pour vous, et ils vont se tromper :) – skaffman