[FIX] Session_End イベントから呼び出された場合、セッション状態に保存された STA オブジェクトへの参照が破損する

文書翻訳 文書翻訳
文書番号: 827164 - 対象製品
Notice
Microsoft .NET Framework 1.0 については、次の資料を参照してください。 827163
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
すべて展開する | すべて折りたたむ

目次

現象

セッション状態にあるシングルスレッド アパートメント (STA) オブジェクトへの参照を保存し、AspCompat 属性を true に設定した場合、Session_End イベントからそのオブジェクトにアクセスしようとすると、参照が破損するか失われることがあります。

: 通常、負荷が高い状態でアプリケーションを実行したり、アプリケーションの実行時に Application Center Test (ACT) などのストレス ツールを使用した場合に、この問題が発生することがあります。この問題が発生すると、イベント ログに "0x8004e005 エラー" エラー メッセージが記録されます。

原因

Session_End イベントはセッションが作成されたのと同じスレッド上で動作する必要がないため、この問題が発生します。STA オブジェクトがセッションが作成されたのと同じスレッド上にはないため、そのオブジェクトにアクセスするためには、マーシャリングが必要になります。

STA オブジェクトをセッション状態に保存することは可能ですが、推奨されません。詳細については、この資料の「関連情報」を参照してください。

解決方法

この修正プログラムでは、Machine.config ファイルに新しい構成設定が追加されます。修正プログラムのインストール後、次のアプリケーション構成が利用可能です。
<httpRuntime apartmentThreading=”true|false” />,
デフォルトでは、apartmentThreading は false に設定されています。apartmentThreading を true に設定すると、次の現象が発生します。
  • すべての Session_Start イベントは、ターゲット ページまたはハンドラと無関係に、セッション ID に対応する STA スレッド上で動作します。
  • すべての Session_End イベントは、セッション ID に対応する STA スレッド上で動作します。
  • 明示的に AspCompat が false に設定されているページを除いたすべてのページに対して、AspCompat が true に設定されます。
: ターゲット ページに対して apartmentThreading が false に設定され、AspCompat が true に設定されている場合は、この修正プログラムの適用後、引き続き STA スレッド上で Session_Start イベントを実行することができます。

この修正プログラムは、セッション状態に直接保存されている STA オブジェクトに対して機能します。この修正プログラムは、セッション状態に保存され、STA オブジェクトへの参照を持つ .NET オブジェクトのように 1 段階深くネストされた STA オブジェクトに対しても機能します。ただし、この修正プログラムは、1 段階よりも深くに格納された STA オブジェクトに対しては機能しません。

重要 : この修正プログラムには、Microsoft Windows インストーラ パッケージと OCM (Optional Component Manager) パッケージの 2 種類のパッケージがあります。Microsoft Windows Server 2003 を使用している場合は、.NET Framework 1.1 ファイルが Windows Server 2003 ファイル保護により監視されているため、Windows Server 2003 (OCM) が必要であることを指定しなければなりません。Windows Server 2003 以外のオペレーティング システムを使用している場合は、Windows インストーラ パッケージの使用を継続する必要があります。

この修正プログラムの OCM バージョンは、次の言語で利用可能です。
  • 英語 (ENU)
  • 日本語 (JPN)
  • ドイツ語 (DEU)
  • フランス語 (FRN)
マイクロソフトでは、現在この問題を修正する修正プログラムを提供中ですが、修正プログラムはこの資料に記載された問題のみを修正することを目的としており、障害があったコンピュータに対してのみ適用することを推奨します。この修正プログラムは、今後さらにテストを行う場合があります。この問題で深刻な影響を受けていない場合は、この修正プログラムが含まれる次の .NET Framework 1.1 Service Pack がリリースされるまで待つことを推奨します。

この問題を解決するには、Microsoft Product Support Services にお問い合わせのうえ、修正プログラムを入手してください。Microsoft Product Support Services の電話番号一覧およびサポート料金については、次のマイクロソフト Web ページを参照してください。
http://support.microsoft.com/contactus/
: Microsoft Support 担当者が、特定のアップデートを適用することにより問題が解決されると判断した場合、まれに通常サポート依頼にかかる料金が免除されることがあります。ただし、特定のアップデートの対象とならない追加の質問および問題については、通常のサポート料金が適用されます。

修正プログラム (英語版) のファイル属性は次表のとおりです。ただし、これより新しい修正プログラムがリリースされている可能性もあります。各ファイルの日付および時刻は、世界協定時刻 (UTC) で示されています。ファイル情報に表示される時刻は、ローカル時刻に変換されています。UTC とローカル時刻との時差を確認するには、コントロール パネルの [日付と時刻] の [タイム ゾーン] タブを使用してください。
   日付            時刻    バージョン      サイズ       ファイル名
   ------------------------------------------------------------------------
   18-Sep-2003  05:18  1.1.4322.947    258,048  Aspnet_isapi.dll
   18-Sep-2003  05:18  1.1.4322.947     20,480  Aspnet_regiis.exe
   18-Sep-2003  05:18  1.1.4322.947     32,768  Aspnet_state.exe
   18-Sep-2003  05:18  1.1.4322.947     32,768  Aspnet_wp.exe
   16-May-2003  01:49                   33,522  Installpersistsqlstate.sql
   16-May-2003  01:49                   34,150  Installsqlstate.sql
   18-Sep-2003  05:09  1.1.4322.947     94,208  Perfcounter.dll
   19-Sep-2003  02:43  1.1.4322.947  1,216,512  System.dll
   19-Sep-2003  02:40  1.1.4322.947    323,584  System.runtime.remoting.dll
   19-Sep-2003  02:43  1.1.4322.947  1,253,376  System.web.dll
   19-Sep-2003  02:42  1.1.4322.947    819,200  System.web.mobile.dll
   19-Sep-2003  02:41  1.1.4322.947    569,344  System.web.services.dll
   19-Sep-2003  02:44  1.1.4322.947  1,335,296  System.xml.dll
   18-Sep-2003  05:13                   14,472  Webuivalidation.js

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

詳細

この修正プログラム パッケージには、第 2 の修正プログラムも含まれています。AspCompat を true に設定して、セッション状態に保存された STA オブジェクトを null に設定した場合、ページの再読み込み時に "NullReferenceException" エラー メッセージが表示されることがあります。第 2 の問題を再現するには、Page_Load イベントに次のコードを 貼り付けてください。
	Session["obj"] = new Object();

Session["obj"] = null;
このページの最初の参照時、コードは正しく実行されます。しかし、ページを再度読み込むと、Microsoft ASP.NET により "NullReferenceException" エラー メッセージが表示され、現在のセッションでページを再度表示することができなくなります。

スタック トレース :
 [NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。]
System.Web.UnsafeNativeMethods.AspCompatOnPageStart(Object obj) +0
System.Web.Util.AspCompatApplicationStep.OnPageStartSessionObjects() +90
System.Web.UI.Page.ProcessRequestMain() +44
AspCompat を false に設定すると、この現象は発生しません。

問題の再現手順

この資料の「現象」に記載されている問題を再現するには、次の手順を実行します。
  1. Microsoft Visual Basic .NET を使用して、Visual Basic Active X DLL オブジェクトを作成します。

    : コンポーネントを Unattended Execution (UE) としてマークした場合は、引き続きエラーが発生します。
  2. DLL クラスに 2 つの関数を作成します。
    1. 文字を返す関数を作成します。
    2. long パラメータを受け取り、LONG 値を返す関数を作成します。この関数では、ループして 1 から渡された数値までを足し合わせます。
  3. 2 つの .aspx ページ (Page1.aspx と Page2.aspx) を持つ、新しい Web Application プロジェクトを作成します。
  4. Session_Start イベントの Global.asax ファイルで、CreateObject を使用して、手順 1 で作成したオブジェクトのインスタンスを作成します。
  5. Page1.aspx の Page_Load イベントで、セッション状態に保存されたオブジェクトから、手順 2 で作成した関数のいずれかを呼び出します。
  6. Page1.aspx 内に Page2.aspx へのハイパーリンクを作成します。
  7. Page2.aspx の Page_Load イベントで、Session_Abandon メソッドを呼び出します。
  8. Application Center Test (ACT) を使用して、Page1.aspx と Page2.aspx を続けて表示する操作を記録するテストを作成します。
  9. テストを 10 ユーザーで実行します。イベント ビューアでエラー 0x8004e005 が記録されているかどうかを確認します。

    : 問題を再現するために、ユーザー数の増加が必要な場合があります。

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
243543 INFO: Do Not Store STA Objects in Session or Application
243815 PRB: Storing STA COM Component in Session Locks Session Down to Single Thread
817005 FIX: Severe Performance Issues When You Bind Session State to Threads in ASPCompat Mode

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 827164 (最終更新日 2003-11-15) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 827164 - 最終更新日: 2014年2月26日 - リビジョン: 2.2
この資料は以下の製品について記述したものです。
  • Microsoft .NET Framework 1.1
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft ASP.NET 1.1
キーワード:?
kbnosurvey kbarchive kbhotfixserver kberrmsg kbnetframe100presp3fix kbfix kbqfe kbcode kbbug KB827164
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com