ConfigurationManager.AppSettings[Key] は、毎回 web.config ファイルから読み込むのでしょうか。
質問
私は
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 アプリで)。
- アプリを起動する
- app.configの値にアクセスする
- app.configに変更を加える
- 新しい値が存在するかどうかを確認する
-
呼び出し
ConfigurationManager.RefreshSection("appSettings")
- 新しい値が存在するかどうかを確認します。
実は、コメントを読んでいれば、時間を節約できたかもしれません。 リフレッシュセクション メソッドのコメントを読んでいれば、時間を節約できたかもしれません :-)
/// <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>
関連
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み] 配置されたアセンブリのマニフェスト定義がアセンブリ参照と一致しない
-
[解決済み] .NETでapp.configやweb.configから設定を読み込む
-
[解決済み] Windowsフォームアプリケーションで、アプリケーションの設定を保存するにはどうすればよいですか?
-
[解決済み] IISのAppPoolIdentityとファイルシステムの書き込みアクセス権
-
[解決済み] ASP.NETでConsole.WriteLineはどこに行くのですか?
-
[解決済み】web.config ファイルを使用して HTTPS を強制的に実行する方法
-
[解決済み】開発環境と本番環境で異なるWeb.configを使用する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み] 関数を終了するには?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】WebResource.axdとは何ですか?