5

実行時にサービスホストの 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 を再読み込みする必要があります。しかし、明らかにこれは宣伝どおりには機能しません。

4

2 に答える 2

9

2 つのこと:

最初にデバッグモードにいるときは、使用していませんsolutionname.exe.config。アプリケーションを停止するとすぐにファイルが元のバージョンに戻るため、実際に使用してsolutionname.vshost.exe.configいるため、一貫性のない動作が発生します。solutionname.vshost.exe.config行った変更が失われます。

このコード行の数秒ConfigurationManager.RefreshSection("connectionStrings"); は、常に期待どおりに機能するとは限りません。親セクションまたはセクション グループを更新する方がよい場合があることがわかりました。この場合は「構成」になります。

だから試してみてくださいConfigurationManager.RefreshSection("configuration");

于 2010-06-04T12:24:06.187 に答える
0

問題は、初めて Visual Studio (デバッガーを有効にして) からアプリケーションを実行したことにあるようです。

bin/debug ディレクトリからアプリケーションを実行すると、キャッシュの問題は存在しないようです。

私の実稼働環境では、これで問題が解決します (つまり、私の問題は解決されました)。しかし、これは行動の違いの原因に対する私の好奇心を殺すものではありません.

于 2010-03-04T11:27:53.870 に答える