ここでは、ライフ サイクルの主要なイベントを列挙しながらアプリケーションのライフ サイクルについて説明し、記述するコードをアプリケーションのライフ サイクルに組み込む方法についても説明します。ASP.NET アプリケーションを初期化して要求を処理するには、ASP.NET の内部でいくつかの処理が必要です。また、ASP.NET は単にブラウザの要求にサービスを提供する Web サーバー アーキテクチャの一部です。ライフ サイクルの適切な段階にコードを記述して意図する結果を得るためには、アプリケーションのライフ サイクルを理解することが重要です。
アプリケーションのライフ サイクルの一般知識
ASP.NET アプリケーションのライフ サイクルの段階を次の表に示します。
|
段階
|
説明
|
| ユーザーは Web サーバーのアプリケーション リソースを要求します。 | ASP.NET アプリケーションのライフ サイクルは、ブラウザが Web サーバー (通常、ASP.NET アプリケーションでは IIS) に送信する要求から始まります。ASP.NET は Web サーバーの下の ISAPI 拡張機能です。Web サーバーが要求を受け取ると、要求元のファイル名の拡張子を調べて要求を処理する ISAPI 拡張機能を特定し、要求を適切な ISAPI 拡張機能に渡します。ASP.NET は、マップされているファイル名の拡張子を処理します (.aspx、.ascx、.ashx、.asmx など)。 メモ : |
|---|
| ファイル名の拡張子が ASP.NET にマップされていない場合、ASP.NET は要求を受け取りません。これは、ASP.NET 認証を使用するアプリケーションにとって重要です。たとえば、.htm ファイルは一般に ASP.NET にマップされないため、ASP.NET は .htm ファイルに対する要求の認証または承認は行いません。したがって、静的コンテンツのみが含まれるファイルを ASP.NET で認証するには、.aspx などの ASP.NET にマップされるファイル名の拡張子を使用してファイルを作成します。 |
メモ : |
|---|
| 特定のファイル名の拡張子にサービスを提供するカスタム ハンドラを作成する場合、IIS で ASP.NET に拡張子をマップし、アプリケーションの Web.config ファイルにハンドラを登録する必要があります。詳細については、「HTTP ハンドラの概要」を参照してください。 |
|
| ASP.NET は、アプリケーションの最初の要求を受け取ります。 | ASP.NET は、アプリケーションの任意のリソースに対する最初の要求を受け取ると、ApplicationManager というクラスがアプリケーション ドメインを作成します。アプリケーション ドメインは、グローバル変数に対してアプリケーション間の独立性を提供し、各アプリケーションが個別にアンロードできるようにします。アプリケーション ドメインには、アプリケーションが格納されているフォルダの名前などのアプリケーションに関する情報にアクセスできるようにするための HostingEnvironment というクラスのインスタンスが作成されます。 次の図に、この関係を示します。 ASP.NET は、App_Code フォルダのアプリケーション コードを含むアプリケーションのトップ レベルの項目を必要に応じてコンパイルします。詳細については、このトピックで後述する「コンパイルのライフ サイクル」を参照してください。 |
| ASP.NET のコア オブジェクトは、各要求に対して作成されます。 | アプリケーション ドメインが作成され、HostingEnvironment オブジェクトのインスタンスが作成された後に、ASP.NET は HttpContext、HttpRequest、HttpResponse などのコア オブジェクトを作成して初期化します。HttpContext クラスには、現在のアプリケーションの要求に固有の HttpRequest、HttpResponse などのオブジェクトが含まれます。HttpRequest オブジェクトには、Cookie とブラウザ情報を含む現在の要求に関する情報が含まれます。HttpResponse オブジェクトには、レンダリングされたすべての出力と Cookie を含むクライアントに送信される応答が含まれます。 |
| HttpApplication オブジェクトが要求に割り当てられます。 | アプリケーションのすべてのコア オブジェクトが初期化された後に、アプリケーションは HttpApplication クラスのインスタンスを作成して開始されます。アプリケーションに Global.asax ファイルがある場合、ASP.NET は代わりに HttpApplication クラスから派生する Global.asax クラスのインスタンスを作成し、これを使用してアプリケーションを表します。 メモ : |
|---|
| アプリケーションで ASP.NET ページまたはプロセスが最初に要求されたときに HttpApplication の新しいインスタンスが作成されます。ただし、パフォーマンスを向上するために、HttpApplication のインスタンスを複数の要求で再利用することもできます。 |
HttpApplication のインスタンスが作成される際に、構成されているすべてのモジュールが作成されます。たとえば、アプリケーションが SessionStateModule モジュールを作成するように構成されている場合、ASP.NET はこのモジュールを作成します。構成されているすべてのモジュールが作成されたら、HttpApplication クラスの Init メソッドが呼び出されます。 次の図に、この関係を示します。 |
| 要求は HttpApplication パイプラインによって処理されます。 | 要求の処理中に、HttpApplication クラスによって次のイベントが実行されます。HttpApplication クラスを拡張する開発者は、特にイベントに注目します。 -
要求を検証し、ブラウザが送信する情報を調べ、悪意のあるマークアップが含まれるかどうかを確認します。詳細については、「ValidateRequest」および「スクリプトによる攻略の概要」を参照してください。 -
Web.config ファイルの UrlMappingsSection セクションで構成されている URL がある場合は、URL マッピングを実行します。 -
BeginRequest イベントを発生します。 -
AuthenticateRequest イベントを発生します。 -
PostAuthenticateRequest イベントを発生します。 -
AuthorizeRequest イベントを発生します。 -
PostAuthorizeRequest イベントを発生します。 -
ResolveRequestCache イベントを発生します。 -
PostResolveRequestCache イベントを発生します。 -
アプリケーションの構成ファイルでマップされる要求されたリソースのファイル名の拡張子に基づいて、IHttpHandler を実装して要求を処理するクラスを選択します。Page クラスから派生するオブジェクトまたはページに対する要求で、ページをコンパイルする必要がある場合、ASP.NET はページのインスタンスを作成する前にコンパイルします。 -
PostMapRequestHandler イベントを発生します。 -
AcquireRequestState イベントを発生します。 -
PostAcquireRequestState イベントを発生します。 -
PreRequestHandlerExecute イベントを発生します。 -
要求に対応する IHttpHandler クラスの ProcessRequest メソッド (または非同期バージョンの BeginProcessRequest) を呼び出します。たとえば、ページを要求している場合は、現在のページのインスタンスが要求を処理します。 -
PostRequestHandlerExecute イベントを発生します。 -
ReleaseRequestState イベントを発生します。 -
PostReleaseRequestState イベントを発生します。 -
Filter プロパティが定義されている場合は、応答フィルタ処理を実行します。 -
UpdateRequestCache イベントを発生します。 -
PostUpdateRequestCache イベントを発生します。 -
EndRequest イベントを発生します。 |
ライフ サイクルのイベントと Global.asax ファイル
アプリケーションはライフ サイクルにおいてイベントを発生するため、開発者はこのイベントを処理し、オーバーライド可能なメソッドを呼び出すことができます。アプリケーションのイベントやメソッドを処理するために、アプリケーションのルート ディレクトリに Global.asax というファイルを作成できます。
Global.asax ファイルを作成すると、ASP.NET はこれを HttpApplication クラスから派生するクラスにコンパイルし、そのクラスを使用してアプリケーションを表します。
HttpApplication のインスタンスは、一度に 1 つの要求のみを処理します。これによって、アプリケーションのクラスの静的ではないメンバにアクセスする際にロックする必要がなくなるため、アプリケーションのイベント処理が簡略化されます。また、アプリケーションのクラスの静的ではないメンバに要求固有のデータを格納することもできます。たとえば、Global.asax ファイルでプロパティを定義して要求固有の値を割り当てることができます。
ASP.NET は、Application_BeginRequest のように、Application_event の名前付け規則を使用して自動的に Global.asax ファイルのハンドラにアプリケーションのイベントを連結します。これは、ASP.NET ページのメソッドが自動的にページの Page_Load などのイベントに連結される方法に似ています。詳細については、「ASP.NET ページのライフ サイクルの概要」を参照してください。
Application_Start メソッドと Application_End メソッドは、HttpApplication のイベントを表さない特別なメソッドです。ASP.NET は、HttpApplication の各インスタンスではなく、アプリケーション ドメインの有効期間中に一度だけそれらを呼び出します。
次の表に、アプリケーションのライフ サイクルで使用するイベントとメソッドの一部を示します。記載されているイベントの他にも多くのイベントがありますが、それほど一般的ではありません。
| イベントまたはメソッド | 説明 |
| Application_Start | ASP.NET アプリケーションの最初のリソース (ページなど) が要求されたときに呼び出されます。Application_Start メソッドは、アプリケーションのライフ サイクル中に一度だけ呼び出されます。このメソッドを使用してデータのキャッシュへの読み込み、静的な値の初期化などのスタートアップ タスクを実行できます。 アプリケーションの開始時には静的データのみを設定してください。インスタンスのデータは、作成された HttpApplication クラスの最初のインスタンスに対してのみ使用可能になるため、この時点では設定しないでください。 |
| Application_ event | 上記のアプリケーションのライフ サイクルの表に記載されているアプリケーションのライフ サイクルの適切な時期に発生します。 Application_Error は、アプリケーションのライフ サイクルのすべての段階で発生します。
要求はショートサーキットされることがあるため、Application_EndRequest はすべての要求で発生することが保証されている唯一のイベントです。たとえば、2 つのモジュールが Application_BeginRequest イベントを処理し、最初のモジュールが例外をスローすると、2 番目のモジュールに対して Application_BeginRequest イベントは呼び出されません。ただし、アプリケーションがリソースをクリーンアップできるように、Application_EndRequest メソッドは必ず呼び出されます。 |
| >HttpApplication.Init | すべてのモジュールが作成された後に、HttpApplication クラスのすべてのインスタンスに対して一度呼び出されます。 |
| Dispose | アプリケーションのインスタンスが破棄される前に呼び出されます。このメソッドを使用すると、アンマネージ リソースを手動で解放できます。詳細については、「アンマネージ リソースのクリーンアップ」を参照してください。 |
| Application_End | アプリケーションがアンロードされる前に、アプリケーションの有効期間に一度だけ呼び出されます。 |
コンパイルのライフ サイクル
アプリケーションに対して最初の要求が行われると、ASP.NET はアプリケーション項目を指定された順番でコンパイルします。最初にコンパイルされる項目はトップレベルの項目と呼ばれます。最初の要求の後、トップレベルの項目は依存関係が変更された場合のみ再コンパイルされます。次の表は、ASP.NET のトップレベルの項目がコンパイルされる順番を示します。
|
項目
|
説明
|
| App_GlobalResources フォルダ | アプリケーションのグローバル リソースがコンパイルされ、リソース アセンブリがビルドされます。アプリケーションの Bin フォルダ内のアセンブリは、リソース アセンブリにリンクされます。 |
| App_WebResources | Web サービスのプロキシの種類が作成およびコンパイルされます。結果の Web 参照アセンブリは、リソース アセンブリが存在する場合は、リソース アセンブリにリンクされます。 |
| Web.config ファイルで定義されるプロファイル プロパティ | プロファイル プロパティがアプリケーションの Web.config ファイルで定義されている場合は、プロファイル オブジェクトを含むアセンブリが生成されます。 |
| App_Code フォルダ | ソース コード ファイルがビルドされ、1 つ以上のアセンブリが作成されます。すべてのコード アセンブリおよびプロファイル アセンブリは、リソースと、存在する場合は Web 参照アセンブリにもリンクされます。 |
| Global.asax | アプリケーション オブジェクトがコンパイルされ、事前に生成されているすべてのアセンブリにリンクされます。 |
アプリケーションのトップレベルの項目がコンパイルされると、ASP.NET はフォルダ、ページ、およびその他の項目を必要に応じてコンパイルします。次の表は、ASP.NET のフォルダと項目がコンパイルされる順番を示します。
|
項目
|
説明
|
| App_LocalResources フォルダ | 要求された項目を含むフォルダに App_LocalResources フォルダが含まれる場合、ローカル リソース フォルダの内容がコンパイルされ、グローバル リソース アセンブリにリンクされます。 |
| 個別の Web ページ (.aspx ファイル)、ユーザー コントロール (.ascx ファイル)、HTTP ハンドラ (.ashx ファイル)、および HTTP モジュール (.asmx ファイル) | 必要に応じてコンパイルされ、ローカル リソース アセンブリおよびトップレベルのアセンブリにリンクされます。 |
| テーマ、マスタ ページ、その他のソース ファイル | ページで参照される個別のテーマ、マスタ ページ、およびその他のソース コード ファイルのスキン ファイルは、参照元のページがコンパイルされるときにコンパイルされます。 |
コンパイルされたアセンブリはサーバー上にキャッシュされて、以降の要求で再利用されます。これは、ソース コードが変更されない限り、アプリケーションが再起動されても維持されます。
アプリケーションは最初の要求でコンパイルされるので、アプリケーションに対する最初の要求は、以降の要求に比べて処理に相当な時間がかかる場合があります。最初の要求に必要な時間を削減するために、アプリケーションをプリコンパイルできます。詳細については、「方法 : ASP.NET Web サイトをプリコンパイルする」を参照してください。
Application Restarts
Web アプリケーションのソース コードを変更すると、ASP.NET はソース ファイルをアセンブリに再コンパイルします。アプリケーションのトップレベルの項目を変更すると、そのアプリケーション内でトップレベルのアセンブリを参照する他のすべてのアセンブリも再コンパイルされます。
また、アプリケーションの既知のフォルダ内の特定の種類のファイルを変更、追加、または削除した場合は、アプリケーションが再起動されます。次のアクションによって、アプリケーションが再起動されます。
-
アプリケーションの Bin フォルダでのアセンブリの追加、変更、または削除。
-
App_GlobalResources フォルダまたは App_LocalResources フォルダでのローカリゼーション リソースの追加、変更、または削除。
-
アプリケーションの Global.asax ファイルの追加、変更、または削除。
-
App_Code ディレクトリ内のソース コード ファイルの追加、変更、または削除。
-
プロファイル構成の追加、変更、または削除。
-
App_WebReferences ディレクトリ内の Web サービス参照の追加、変更、または削除。
-
アプリケーションの Web.config ファイルの追加、変更、または削除。
アプリケーションの再起動が必要な場合、ASP.NET は、アプリケーション ドメインを再起動して新しいアセンブリを読み込む前に、既存のアプリケーション ドメインと古いアセンブリからの保留中の要求をすべて処理します。
HTTP モジュール
ASP.NET アプリケーションのライフ サイクルは、IHttpModule のクラスを使用して拡張できます。ASP.NET には、IHttpModule を実装する SessionStateModule などのクラスがあります。IHttpModule を実装するクラスを独自に作成することもできます。
モジュールをアプリケーションに追加すると、モジュール自体がイベントを発生できます。アプリケーションは、Global.asax ファイルで modulename_eventname の表記を使用してこれらのイベントをサブスクライブできます。たとえば、FormsAuthenticationModule オブジェクトが発生する Authenticate イベントを処理するには、FormsAuthentication_Authenticate というハンドラを作成します。
ASP.NET では、SessionStateModule クラスは既定で有効になっています。Session_Start などのすべてのセッション イベントは、Session_event として自動的に関連付けられます。Start イベントは、新しいセッションが作成されるたびに発生します。詳細については、「セッション状態の概要」を参照してください。
参照