2010-03-03 2 views
5

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é.

+0

Pour le gars qui a édité mes tags. Cela n'a rien à voir avec ASP.Net. Mon servicehost est une application console. –

+1

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

Répondre

0

Le problème semble résider dans le fait que la première fois, je lance l'application à partir de Visual Studio (avec débogueur activé).

Si j'exécute l'application à partir du répertoire bin/debug, le problème de mise en cache ne semble pas exister.

Pour mon environnement de production, cela résoudra mon problème (en d'autres termes, mon problème est résolu). Ceci cependant ne tue pas ma curiosité de la cause de la différence de comportement.

9

2 choses:

D'abord lorsque vous êtes en mode débogage vous n'utilisez pas solutionname.exe.config; vous utilisez réellement solutionname.vshost.exe.config alors c'est pourquoi votre comportement incohérent, car le fichier solutionname.vshost.exe.config retourne à la version originale dès que vous arrêtez l'application; perdre tous les changements que vous avez faits.

Secondes cette ligne de code ConfigurationManager.RefreshSection("connectionStrings"); ne fonctionne pas toujours comme prévu. J'ai trouvé qu'il est parfois préférable d'actualiser la section parent ou le groupe de sections; dans ce cas serait "configuration".

alors essayez ConfigurationManager.RefreshSection("configuration");

+0

ConfigurationManage.RefreshSection ("configuration") n'a pas aidé pour moi ... J'ai travaillé autour de cela par en utilisant Application.Restart() après avoir enregistré les modifications apportées à la configuration (PS Notez que Application.Restart() doit être appelée à partir de Program.Main() sinon l'application de redémarrage sera démarrée en 2 instances) – Prokurors

+0

J'ai vérifié qu'il est malheureusement impossible de Exécutez RefreshSection sur "configuration". – SondreB

Questions connexes