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.asaxBeginRequest            
IHTTPModuleBeginRequest
Global.asaxApplication_BeginRequest
Global.asaxDefaultAuthentication
Global.asaxAuthenticateRequest
IHTTPModuleAuthenticateRequest
Global.asaxApplication_AuthenticateRequest
Global.asaxPostAuthenticateRequest
IHTTPModulePostAuthenticateRequest
Global.asaxAuthorizeRequest
IHTTPModuleAuthorizeRequest
Global.asaxPostAuthorizeRequest
IHTTPModulePostAuthorizeRequest
Global.asaxResolveRequestCache
IHTTPModuleResolveRequestCache
Global.asaxPostResolveRequestCache
IHTTPModulePostResolveRequestCache
PageNew
Global.asaxPostMapRequestHandler
IHTTPModulePostMapRequestHandler
Global.asaxAcquireRequestState
IHTTPModuleAcquireRequestState
Global.asaxPostAcquireRequestState
IHTTPModulePostAcquireRequestState
Global.asaxPreRequestHandlerExecute
IHTTPModulePreRequestHandlerExecute
PagePreInit
MasterPageNew
MasterPageContentPlaceHolder Init
MasterPageInit
PageInit
PageInitComplete
PagePreLoad
PageLoad
MasterPageLoad
MasterPageContentPlaceHolder Load
PageLoadComplete
PagePreRender
MasterPagePreRender
MasterPageContentPlaceHolder PreRender
PagePreRenderComplete
PageSaveStateComplete
MasterPageContentPlaceHolder Unload
MasterPageUnload
PageUnload
Global.asaxPostRequestHandlerExecute
IHTTPModulePostRequestHandlerExecute
Global.asaxReleaseRequestState
IHTTPModuleReleaseRequestState
Global.asaxPostReleaseRequestState
IHTTPModulePostReleaseRequestState
Global.asaxUpdateRequestCache
IHTTPModuleUpdateRequestCache
Global.asaxPostUpdateRequestCache
IHTTPModulePostUpdateRequestCache
Global.asaxEndRequest
IHTTPModuleEndRequest
Global.asaxPreSendRequestHeaders
Global.asaxPreSendRequestContent

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

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

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*