実行時にサービスホストの App.Config にある接続文字列のデータベース名を変更し、その後別のデータベースに接続して再起動しようとしています。これは正常に機能しますが、アプリケーションが数秒間シャットダウンされた場合に限ります。アプリケーションを数秒間シャットダウンすると、ConfigurationManager.Connectionstrings のキャッシュがクリアされるようです。問題は、この必要なシャットダウン時間が原因で、アプリケーションで Application.Restart() を使用できないことです。
このキャッシング動作の奇妙な点は、値がメモリ内で更新された場合でも (この例では 2 回目に要求された場合)、更新された値が正しく表示されることです。しかし、アプリケーションを再起動すると、古い値が再び現れるようです。
動作を確認するには、新しいコンソール アプリを作成します。
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>
次に、次のコードを Main メソッドに追加します
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();
この動作を再現するには、(F5 キーを押して) アプリケーションを実行し、閉じる必要があります。その後、solutionname.exe.config ファイルが変更された値で表示されます。アプリケーションを 2 度目に実行すると (今回は solutionname.exe をダブルクリックします)、アプリケーションを終了した直後に実行するか、数秒待ってから実行すると、動作の違いに気付くでしょう。
私の意見では、ConfigurationManager.RefreshSection("connectionStrings"); のため、configsection を再読み込みする必要があります。しかし、明らかにこれは宣伝どおりには機能しません。