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 イベントの方が都合がいいかなと思います。