大きな負荷がかかった ASP.NET アプリケーションでカスタム構成セクション ハンドラを使用するとアクセス違反が発生する

この記事は、以前は次の ID で公開されていました: JP307513
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.Configuration
現象
ASP.NET アプリケーションでカスタム構成セクション ハンドラを使用している場合、ASP.NET アプリケーションに大きな負荷がかかっているときに、Aspnet_wp.exe プロセス (インターネット インフォメーション サービス (IIS) 6.0 上で実行するアプリケーションの場合は W3wp.exe プロセス) でアクセス違反の初回例外が発生することがあります。
原因
IConfigurationSectionHandler インターフェイスの実装がスレッド セーフかつステートレスでない場合、または Create メソッドから返されるオブジェクトがスレッド セーフかつ不変でない場合、複数のスレッドが同一の構成オブジェクトに同時にアクセスすると、この問題が発生する可能性があります。
解決方法
独自の ASP.NET 構成セクション ハンドラを作成する場合、以下の指針に従って IConfigurationSectionHandler インターフェイスを実装します。
  • IConfigurationSectionHandler インターフェイスを実装するクラスのインスタンスは、スレッド セーフかつステートレスである必要があります。
  • IConfigurationSectionHandler.Create メソッドから返されるオブジェクトは、スレッド セーフかつ不変である必要があります。
  • IConfigurationSectionHandler.Create メソッドへの親引数を変更しないようにします。
状況
この動作は仕様です。
詳細
IConfigurationSectionHandler のインスタンスはスレッド セーフかつステートレスである必要があります。これは、IConfigurationSectionHandler.Create メソッドが複数のスレッドから同時に呼び出し可能である必要があるためです。

また、IConfigurationSectionHandler.Create によって生成される構成オブジェクトはスレッド セーフかつ不変である必要があります。構成システムは構成オブジェクトをキャッシュに保持するため、IConfigurationSectionHandler.Create への親引数は変更しないことが重要です。たとえば、IConfigurationSectionHandler.Create の戻り値が、親をわずかに変更しただけのものである場合、元の親ではなく複製を変更します。
関連情報
ASP.NET の構成の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
307626 [INFO] ASP.NET の構成の概要
309045 [HOW TO] Visual C# .NET で独自の ASP.NET 構成セクション ハンドラを作成する方法
AV kbreadme
プロパティ

文書番号:307513 - 最終更新日: 02/24/2014 15:36:24 - リビジョン: 3.2

  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft .NET Framework 1.1
  • kbnosurvey kbarchive kbconfig kbhttphandlers kbhttpruntime kbprb kbreadme KB307513
フィードバック