ASP.NET のイベント発生順序

  • このエントリーをはてなブックマークに追加
  • このエントリーをはてなブックマークに追加

ASP.NET で、ページ(マスターページ)の初期処理と終了処理を抽象クラスを作成せず、Global.asax のイベントまたは、カスタム HTTPModule で実行しようと思いました。
確実に実行させるには、どのイベントに記述するべきか調べる為、ASP.NET の起動からページが表示され終了するまでのイベント発生順序がしりたくてトレースしてみました。
IIS起動直後にアクセスしたトレースと、2回目以降のトレースを一覧にしてみました。

     Global.asax
     IHTTPModule を利用したカスタムモジュール
     セッション
     ページ
     マスターページ

IIS起動直後にアクセスしたトレース

Global.asax Application_Start Web アプリ全体の初期処理
IHTTPModule New
IHTTPModule Init
Global.asax BeginRequest
IHTTPModule BeginRequest
Global.asax Application_BeginRequest
Global.asax DefaultAuthentication
Global.asax AuthenticateRequest
IHTTPModule AuthenticateRequest
Global.asax Application_AuthenticateRequest
Global.asax PostAuthenticateRequest
IHTTPModule PostAuthenticateRequest
Global.asax AuthorizeRequest
IHTTPModule AuthorizeRequest
Global.asax PostAuthorizeRequest
IHTTPModule PostAuthorizeRequest
Global.asax ResolveRequestCache
IHTTPModule ResolveRequestCache
Global.asax PostResolveRequestCache
IHTTPModule PostResolveRequestCache
Page New
Global.asax PostMapRequestHandler
IHTTPModule PostMapRequestHandler
Global.asax Session_Start
Global.asax AcquireRequestState Page に対して初期処理
IHTTPModule AcquireRequestState
Global.asax PostAcquireRequestState
IHTTPModule PostAcquireRequestState
Global.asax PreRequestHandlerExecute
IHTTPModule PreRequestHandlerExecute
Page PreInit
MasterPage New
MasterPage ContentPlaceHolder Init
MasterPage Init
Page Init
Page InitComplete
Page PreLoad
Page Load
MasterPage Load
MasterPage ContentPlaceHolder Load
Page LoadComplete
Page PreRender
MasterPage PreRender
MasterPage ContentPlaceHolder PreRender
Page PreRenderComplete
Page SaveStateComplete
MasterPage ContentPlaceHolder Unload
MasterPage Unload
Page Unload
Global.asax PostRequestHandlerExecute Page に対して終了処理
IHTTPModule PostRequestHandlerExecute
Global.asax ReleaseRequestState
IHTTPModule ReleaseRequestState
Global.asax PostReleaseRequestState
IHTTPModule PostReleaseRequestState
Global.asax UpdateRequestCache
IHTTPModule UpdateRequestCache
Global.asax PostUpdateRequestCache
IHTTPModule PostUpdateRequestCache
Global.asax EndRequest
IHTTPModule EndRequest
Global.asax PreSendRequestHeaders
Global.asax PreSendRequestContent
Global.asax Session_End
IHTTPModule Dispose
Global.asax Application_End Web アプリ全体の終了処理

2回目以降のトレース

Global.asax BeginRequest             
IHTTPModule BeginRequest
Global.asax Application_BeginRequest
Global.asax DefaultAuthentication
Global.asax AuthenticateRequest
IHTTPModule AuthenticateRequest
Global.asax Application_AuthenticateRequest
Global.asax PostAuthenticateRequest
IHTTPModule PostAuthenticateRequest
Global.asax AuthorizeRequest
IHTTPModule AuthorizeRequest
Global.asax PostAuthorizeRequest
IHTTPModule PostAuthorizeRequest
Global.asax ResolveRequestCache
IHTTPModule ResolveRequestCache
Global.asax PostResolveRequestCache
IHTTPModule PostResolveRequestCache
Page New
Global.asax PostMapRequestHandler
IHTTPModule PostMapRequestHandler
Global.asax AcquireRequestState
IHTTPModule AcquireRequestState
Global.asax PostAcquireRequestState
IHTTPModule PostAcquireRequestState
Global.asax PreRequestHandlerExecute
IHTTPModule PreRequestHandlerExecute
Page PreInit
MasterPage New
MasterPage ContentPlaceHolder Init
MasterPage Init
Page Init
Page InitComplete
Page PreLoad
Page Load
MasterPage Load
MasterPage ContentPlaceHolder Load
Page LoadComplete
Page PreRender
MasterPage PreRender
MasterPage ContentPlaceHolder PreRender
Page PreRenderComplete
Page SaveStateComplete
MasterPage ContentPlaceHolder Unload
MasterPage Unload
Page Unload
Global.asax PostRequestHandlerExecute
IHTTPModule PostRequestHandlerExecute
Global.asax ReleaseRequestState
IHTTPModule ReleaseRequestState
Global.asax PostReleaseRequestState
IHTTPModule PostReleaseRequestState
Global.asax UpdateRequestCache
IHTTPModule UpdateRequestCache
Global.asax PostUpdateRequestCache
IHTTPModule PostUpdateRequestCache
Global.asax EndRequest
IHTTPModule EndRequest
Global.asax PreSendRequestHeaders
Global.asax PreSendRequestContent

「IIS起動直後にアクセスしたトレース」の最後の列へ備考として処理を記述するイベントを示してみました。この結果から、ページに対しての初期処理は可能と分かりましたが、マスターページの初期処理は不可能だと判明。

ページのインスタンスが生成された時にはマスターページのインスタンスは生成されておらず、イベント ハンドラが実行されたあとで生成されるためです。

マスターページに関してだけは抽象クラスを作成するというのも統一性がないので嫌です。

そこで、ページの初期処理を行うときに(AcquireRequestState ~ PreRequestHandlerExecute)マスターページの INIT イベントをハンドリングすることにしました。
マスターページの INIT イベントは、ページの INIT イベントよりも前に発生します。
Load イベントだと逆になるので INIT イベントの方が都合がいいかなと思います。

関連記事:

Pocket
Bookmark this on Delicious
Bookmark this on Google Bookmarks

ASP.NET のイベント発生順序” への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。


*

This blog is kept spam free by WP-SpamFree.