ASP.NET のリクエスト処理手順
自分で「そういえば、前にこれどこかにまとめてたよな」と思って「自分の投稿」を検索するのって、それをしないためにここに書いてるんじゃなかったか(苦笑
ASP.NET のリクエスト処理の手順を知っておくことは、コンテンツフィルタなどのフィルタ作成や、何らかのイベントハンドラを追加する際に、どこに追加するべきなのかを考えるときに必須といえます。MSDN では概ね HttpApplication あたりの解説にまとまっています。
以下は、MSDN フォーラムへ AssemblyResourceLoader の不具合回避の際に投稿した自分自身の記述
リクエスト処理は次のような手順をふんでおり、
- BeginRequest
- AuthenticateRequest
- PostAuthenticateRequest
- AuthorizeRequest
- PostAuthorizeRequest
- ResolveRequestCache
- PostResolveRequestCache
- (MapRequestHandler)
- PostMapRequestHandler
- AcquireRequestState
- PostAcquireRequestState
- PreRequestHandlerExecute
- (RequestHandlerExecute)
- PostRequestHandlerExecute
- ReleaseRequestState
- PostReleaseRequestState
- (FilterOutput)
- UpdateRequestCache
- PostUpdateRequestCache
- EndRequest
コンテンツフィルタの実施は FilterOutput の部分で行われますので、フィルタの設定はそれより早い段階で行う必要があります。
CurrentHandler が設定されるのは MapRequestHandler の部分です。これより早い段階では、まだ「このWebRequestを誰が処理するのか?」が決定していません。MapRequestHandler より後であれば、CurrentHandler には対応するコンテンツハンドラが格納されているはずです。
フィルタの設定個所としては、認証処理などとの関連性にもよりますが、PreRequestHandlerExecute や PostRequestHandlerExecute あたりがよいかと思います。このイベントであれば、 (HttpContext.CurrentHandler is AssemblyResourceLoader) で判定できます。
これは、AssemblyResourceLoader がコンテンツフィルタとして設定されているとき、他のカスタムフィルタを設定しないようにするためのイベントはどれを利用すれば良いか? という話で、IgnoreFurtherWrites による不具合回避のため、AsseblyResourceLoader を間接的にであっても利用している Web Application では、カスタムフィルタの追加時にはこのような注意が必要になります。問題点や具体的なコード例など、もうすこし詳しい話は MSDNForum の投稿をご覧ください。