[INFO] ASP.NET のアプリケーション インスタンス、アプリケーション イベント、およびアプリケーション状態

文書翻訳 文書翻訳
文書番号: 312607 - 対象製品
この記事は、以前は次の ID で公開されていました: JP312607
すべて展開する | すべて折りたたむ

目次

概要

ASP.NET の HttpApplication オブジェクトでは、プログラミング モデルを単純にするために、多くの複雑な概念が隠ぺいされています。この資料では、これらの複雑な概念の一部について説明しています。さらに、従来の Microsoft Active Server Pages (ASP) の Application オブジェクトとの互換性の問題について、ASP.NET における対処方法についても説明します。

この資料では、以下の内容について説明します。

詳細

アプリケーション クラスとアプリケーション インスタンス

アプリケーション クラスは Global.asax ファイルに定義されます。Global.asax のコードには、System.Web.HttpApplication から派生する新しいクラスが定義されます。Global.asax ファイルがない場合は、基本クラスの HttpApplication がアプリケーション クラスとして使用されます。

ASP.NET ランタイムは、要求を同時に処理するために必要な分のアプリケーション クラスのインスタンスを作成します。ほとんどのアプリケーションでは、この数の上限はスレッド数に一致し、ハードウェア、サーバーの負荷、構成などに応じて 1 〜 100 の範囲に収まります。アプリケーション インスタンスは多くの要求によって再利用され、負荷が低い間は未使用のアプリケーション インスタンスの一覧が保持されます。アプリケーション インスタンスはスレッド セーフに使用されます。つまり、一度に処理される要求は 1 つです。これには重要な意味があります。
  • アプリケーション クラスの非静的メンバにアクセスするとき、ロックを気にかける必要がない。
  • アプリケーション コードにおいて、各要求に対する要求データをアプリケーション クラスの非静的メンバに格納できる (ただし、EndRequest イベントの発生後を除きます。このイベントでは、要求が長時間にわたって維持される場合があるためです)。
すべてのクラスの静的メンバは、アプリケーション クラスの場合も含めてスレッド セーフではありません。このため、静的メンバにアクセスする場合は、ユーザー コードで適切なロックを実装する必要があります。これは、アプリケーション クラスに追加したすべての静的メンバに対して適用されます。

現在の要求に関連付けられているアプリケーション インスタンスにアクセスするには、次のガイドラインに従います。
  • Global.asax からは、this または me オブジェクトを使用する。
  • ページからは、各ページに含まれている厳密に型指定された ApplicationInstance プロパティを使用する。
  • HttpContext オブジェクトからは、HttpContext.ApplicationInstance プロパティ (HttpApplication 型) を使用する。
: 従来の ASP では Application は、グローバル アプリケーション状態のディクショナリを示しています。このため ASP.NET では、現在の要求を処理するアプリケーション インスタンスを参照するプロパティ名として、Application ではなく ApplicationInstance が使用されます。

アプリケーション イベント

要求の有効期間は、一連のアプリケーション イベント (および ASP.NET に実装されている暗黙的な処理) から構成されます。これらのイベントを実行順に列挙すると、次のようになります。
  1. BeginRequest イベント
  2. AuthenticateRequest イベント
  3. DefaultAuthentication 内部イベント
  4. AuthorizeRequest イベント
  5. ResolveRequestCache イベント
  6. "ハンドラをマップ" する内部処理 (コンパイルの実行時、ページ インスタンスが作成される)
  7. AcquireRequestState イベント
  8. PreRequestHandlerExecute イベント
  9. "ハンドラを実行" する内部処理 (ページの実行時)
  10. PostRequestHandlerExecute イベント
  11. ReleaseRequestState イベント
  12. 応答にフィルタをかける内部処理 UpdateRequestCache イベント
  13. UpdateRequestCache イベント
  14. EndRequest イベント
: Server.Transfer または Response.Redirect(string) を使用すると、実質的に現在の要求が中断され、上記のイベントの一部は発生しません。ただし、この場合は EndRequest イベントが発生します。

これらのイベントを処理できる項目は次のとおりです。
  • ASP.NET ページ フレームワークの内部 (たとえば上記一覧の手順 6.、9.、および 12.)。
  • アプリケーションとして構成された HTTP モジュール。デフォルトの HTTP モジュールの一覧は、Machine.config ファイルで定義されます。
  • Global.asax 内のコードのうち、Application_[On]EventName メソッドによってフックされるもの、または別のハンドラ名のイベント ハンドラを追加することによって明示的にフックされるもの。
各イベントには、同期または非同期のサブスクライバを設定できます。最初に非同期サブスクライバが実行されます。すべてのイベントが常に実行されるとは限りませんが、EndRequest だけは必ず実行されます。このため、要求後のクリーンアップはすべて EndRequest イベントで実行するようにします。

: ほとんどの場合、実際の応答がクライアントに送信されるのは、アプリケーション インスタンスが応答を終了した後 (EndRequest の後) になります。

Application_OnStart と Application_OnEnd

ASP.NET には、従来の ASP との互換性を保つために、Application_OnStart および Application_OnEnd という特有の "イベント" が用意されています。これらの "イベント" は、アプリケーションの有効期間中に一度だけ実行され、アプリケーション インスタンスごとには実行されません。したがって、これらのメソッドで非静的メンバを変更しても、影響を受けるのは 1 つのアプリケーション インスタンスのみであり、すべてのインスタンスに適用されることにはなりません。個々のアプリケーション インスタンスは、コンストラクタの中で初期化するか、または Init メソッドをオーバーライドすることで初期化できます。

Application_OnStart は、論理的にはアプリケーション クラスのクラス コンストラクタに相当するものですが、便利な点が 1 つあります。Application_OnStart では、アプリケーションに対する最初の要求の HttpContext にコードからアクセスできます。

アプリケーション状態

アプリケーション状態は、実行時バインディングされたオブジェクトのグローバル ディクショナリです。これは、Microsoft Visual Basic Scripting Edition (VBScript) にグローバル変数が存在しないことに対処するために、従来の ASP に導入された機能です。ASP.NET では、次のいずれかによってアプリケーション状態にアクセスできます。
  • Application プロパティ (HttpApplication クラスと Page クラスの両方で定義されています)
  • HttpContext.Application
ASP.NET には、主に従来の ASP との互換性を保ち、既存のアプリケーションの ASP.NET への移行を簡単にするためにアプリケーション状態が含まれています。データは Application オブジェクトに格納するのではなく、アプリケーション クラスの静的メンバに格納することを推奨します。Application ディクショナリ内の項目より静的変数の方が高速にアクセスできるため、アプリケーション クラスの静的メンバを使用すればパフォーマンスが向上します。

Microsoft Visual C# .NET や Microsoft Visual Basic .NET のページから静的なアプリケーション メンバにアクセスするには、Global.asax の ClassName 属性を使用してアプリケーション クラスに名前を付ける必要があります。例を次に示します。
<%@ Application Language="C# | VB" ClassName="MyClass" %>
				
たとえば、Global.asax ファイルで静的メンバに MyStaticMember という名前を付けた場合、ページからそのメンバにアクセスするには、MyClass.MyStaticMember と記述します。

プロパティ

文書番号: 312607 - 最終更新日: 2005年11月21日 - リビジョン: 5.3
この資料は以下の製品について記述したものです。
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
キーワード:?
kbappdev kbhttpruntime kbinfo kbstate KB312607
"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