1. ホーム
  2. c#

ConfigurationManager.AppSettings[Key] は、毎回 web.config ファイルから読み込むのでしょうか。

2023-10-02 18:09:29

質問

私は ConfigurationManager.AppSettings[Key] はどのように機能するのでしょうか。

キーが必要なたびに物理ファイルから読み込んでいるのでしょうか?もしそうなら、web.config のすべてのアプリの設定をキャッシュで読み込んでから、そこから読み込むべきでしょうか。

それとも ASP.NET または IIS は、アプリケーションの起動時に一度だけ web.config ファイルを読み込むのでしょうか?

物理ファイルが読み込まれるたびにアクセスされるかどうかは、どのように確認すればよいのでしょうか。web.config を変更すると、IIS がアプリケーションを再起動するので、その方法では検証できません。

どのように解決するのですか?

プロパティの最初のアクセス時に、キャッシュされるため、値を要求するたびに物理ファイルから読み込むことはありません。このため、Windows アプリを再起動する必要があります (または リフレッシュ が必要な理由であり、web.config を編集すると ASP.Net アプリが自動的に再起動する理由です。ASP.Net がハード的に再起動する理由については、回答中のリファレンスで説明されています。 web.config を変更したときに ASP.NET アプリケーションが再起動するのを防ぐ方法 .

を使用して確認することができます。 ILSpy を使い、System.Configuration の内部を見ることで確認できます。

public static NameValueCollection AppSettings
{
    get
    {
        object section = ConfigurationManager.GetSection("appSettings");
        if (section == null || !(section is NameValueCollection))
        {
            throw new ConfigurationErrorsException(SR.GetString("Config_appsettings_declaration_invalid"));
        }
        return (NameValueCollection)section;
    }
}

最初は、これは確かに毎回セクションを取得するように見えます。GetSectionを見てみると。

public static object GetSection(string sectionName)
{
    if (string.IsNullOrEmpty(sectionName))
    {
        return null;
    }
    ConfigurationManager.PrepareConfigSystem();
    return ConfigurationManager.s_configSystem.GetSection(sectionName);
}

ここでの重要な行は PrepareConfigSystem() のインスタンスを初期化することです。 IInternalConfigSystem フィールドのインスタンスを初期化します - 具体的な型は ClientConfigurationSystem

この読み込みの一部として コンフィギュレーション クラスのインスタンスが作成されます。このクラスは事実上、設定ファイルのオブジェクト表現であり、静的フィールドの ClientConfigurationSystem の ClientConfigurationHost プロパティによって保持されるようです。

次のようにすることで、経験的にこれをテストできます (Windows フォームまたは WPF アプリで)。

  1. アプリを起動する
  2. app.configの値にアクセスする
  3. app.configに変更を加える
  4. 新しい値が存在するかどうかを確認する
  5. 呼び出し ConfigurationManager.RefreshSection("appSettings")
  6. 新しい値が存在するかどうかを確認します。

実は、コメントを読んでいれば、時間を節約できたかもしれません。 リフレッシュセクション メソッドのコメントを読んでいれば、時間を節約できたかもしれません :-)

/// <summary>Refreshes the named section so the next time that it is retrieved it will be re-read from disk.</summary>
/// <param name="sectionName">The configuration section name or the configuration path and section name of the section to refresh.</param>