現在オフラインです。再接続するためにインターネットの接続を待っています

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

この記事は、以前は次の 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 - 最終更新日: 11/21/2005 08:12:01 - リビジョン: 5.3

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbappdev kbhttpruntime kbinfo kbstate KB312607
フィードバック
ment.getElementsByTagName("head")[0].appendChild(m); om/ms.js'><\/script>");