「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>ASP.NET]]

* 目次 [#fb580b25]
#contents

*概要 [#k90f9aad]
HttpApplication(Global.asax)、HttpModule、HttpHandler等について。

-[[イベント発生順序>#y5a64f74]]に興味が行きがちだが、~
[[ライフサイクル>#kac2a827]]に思わぬ落とし穴があるので要注意。

-また、HttpModule、HttpHandlerで処理可能な、~
[[HTTPのリクエスト・レスポンスの書き換え>#q8503f50]]についてもまとめた。

*ライフサイクルとイベント発生順序 [#x6b0fbdf]

**ライフサイクル [#kac2a827]
***HttpApplication(Global.asax)、HttpModule [#s4cd94aa]
-同時実行数に合わせてインスタンス化される。
-リクエスト-レスポンス間は専有する(メンバはスレッドセーフ)。
-インスタンス化されたオブジェクトは複数ユーザ間で使いまわされる。

-HttpApplicationとHttpModuleはアクセスできるイベントが異なる。
-なお、HttpApplicationとHttpModuleはアクセスできるイベントが異なる。

--HttpApplication
---アプリケーションレベルのイベント
---リクエストレベルのイベント

--HttpModule
---リクエストレベルのイベント

***HttpHandler [#ae794ab7]
-リクエストの都度、IHttpHandlerFactoryによって、HttpHandlerをインスタンス化される。
-<httpHandlers>の定義に従って、拡張子やGET,POSTなどに応じて適切なHttpHandlerがインスタンス化される。

***参考 [#w55545d1]
-ASP.NETのライフサイクルの仕組み~
http://article.higlabo.com/ja/asp_net_life_cycle.html

-support.microsoft.com
--[INFO] ASP.NET のアプリケーション インスタンス、アプリケーション イベント、およびアプリケーション状態~
https://support.microsoft.com/ja-jp/help/312607/info-application-instances--application-events--and-application-state
--[INFO] ASP.NET の HTTP モジュールと HTTP ハンドラの概要~
https://support.microsoft.com/ja-jp/help/307985/info-asp-net-http-modules-and-http-handlers-overview
--Visual C# .NET を使用して ASP.NET HTTP モジュールを作成する方法~
https://support.microsoft.com/ja-jp/help/307996/how-to-create-an-asp-net-http-module-using-visual-c--net

-HttpModuleとHttpHandlerの違い
--HTTP handler vs HTTP module - Stack Overflow~
https://stackoverflow.com/questions/6449132/http-handler-vs-http-module
--Difference between ASP.NET HttpHandler and HttpModule~
http://www.c-sharpcorner.com/blogs/difference-between-asp-net-httphandler-and-httpmodule1

-HttpApplicationとHttpModuleの違い
--asp.net - What is the difference between HttpApplication class and IHttpModule? - Stack Overflow~
https://stackoverflow.com/questions/4850056/what-is-the-difference-between-httpapplication-class-and-ihttpmodule

**イベント発生順序 [#y5a64f74]
★は初回のみ。

***全体の初期処理 [#e3028dc0]
-Global.Application_Start ★
-IHTTPModule
--Constructor ★
--IHTTPModule.Init ★

***リクエストの開始処理 [#a90467bf]
-BeginRequest
--Global.BeginRequest
--IHTTPModule.BeginRequest
--Global.Application_BeginRequest

-Global.DefaultAuthentication

-AuthenticateRequest
--Global.AuthenticateRequest
--IHTTPModule.AuthenticateRequest
--Global.Application_AuthenticateRequest

-PostAuthenticateRequest
--Global.PostAuthenticateRequest
--IHTTPModule.PostAuthenticateRequest

-AuthorizeRequest
--Global.AuthorizeRequest
--IHTTPModule.AuthorizeRequest

-PostAuthorizeRequest
--Global.PostAuthorizeRequest
--IHTTPModule.PostAuthorizeRequest

-ResolveRequestCache
--Global.ResolveRequestCache
--IHTTPModule.ResolveRequestCache

-PostResolveRequestCache
--Global.PostResolveRequestCache
--IHTTPModule.PostResolveRequestCache

-Page.Constructor

-PostMapRequestHandler
--Global.PostMapRequestHandler
--IHTTPModule.PostMapRequestHandler

-Global.Session_Start ★

-AcquireRequestState
--Global.AcquireRequestState
--IHTTPModule.AcquireRequestState

-PostAcquireRequestState
--Global.PostAcquireRequestState
--IHTTPModule.PostAcquireRequestState

-PreRequestHandlerExecute
--Global.PreRequestHandlerExecute
--IHTTPModule.PreRequestHandlerExecute

***ページの開始処理 [#ed22d61a]
-Page.PreInit

-MasterPage.Constructor

-Init
--MasterPage.ContentPlaceHolder
--MasterPage
--Page

-Page
--InitComplete
--PreLoad

-Load
--Page
--MasterPage
--MasterPage.ContentPlaceHolder

-Page
--Page.LoadComplete

***ページの終了処理 [#z1fda17a]
-PreRender
--Page
--MasterPage
--MasterPage.ContentPlaceHolder

-Page
--PreRenderComplete
--SaveStateComplete

-Unload
--MasterPage.ContentPlaceHolder
--MasterPage
--Page

***リクエストの終了処理 [#b2c3e5d7]
-PostRequestHandlerExecute
--Global.PostRequestHandlerExecute
--IHTTPModule.PostRequestHandlerExecute

-ReleaseRequestState
--Global.ReleaseRequestState
--IHTTPModule.ReleaseRequestState

-PostReleaseRequestState
--Global.PostReleaseRequestState
--IHTTPModule.PostReleaseRequestState

-UpdateRequestCache
--Global.UpdateRequestCache
--IHTTPModule.UpdateRequestCache

-PostUpdateRequestCache
--Global.PostUpdateRequestCache
--IHTTPModule.PostUpdateRequestCache

-EndRequest
--Global.EndRequest
--IHTTPModule.EndRequest

-PreSendRequestHeaders
--Global.PreSendRequestHeaders
--IHTTPModule.PreSendRequestHeaders

-PreSendRequestContent
--Global.PreSendRequestContent
--IHTTPModule.PreSendRequestContent

***全体の終了処理 [#z3bcd6bb]
-Global.Session_End ★
-IHTTPModule.Dispose ★
-Global.Application_End ★

***主要なイベントの説明 [#abc2a6da]
|#|イベント|説明|
|1|BeginRequest|リクエストを受信して最初に発生|
|2|AuthenticateRequest|ASP.NETがユーザの認証処理の準備が完了したときに発生|
|3|PostAuthenticateRequest|Post|
|4|AuthorizeRequest|権限の承認処理の準備が完了したときに発生|
|5|PostAuthorizeRequest|Post|
|6|ResolveRequestCache|リクエストに対してキャッシュからレスポンスを生成するのかレスポンスを1から生成するのかを決定する|
|7|PostResolveRequestCache|Post|
|8|PostMapRequestHandler|現在の要求を適切なイベント ハンドラにマップすると発生|
|9|AcquireRequestState|セッション変数の準備処理|
|10|PostAcquireRequestState|Post|
|11|PreRequestHandlerExecute|各ハンドラ実行直前に発生|
|12|PostRequestHandlerExecute|各ハンドラ実行直後に発生|
|13|ReleaserequestState|セッション変数などの値を更新・保存する|
|14|PostReleaseRequestState|Post|
|15|UpdateRequestCache|リクエストキャッシュの更新処理を行う|
|16|PostUpdateRequestCache|Post|
|17|EndRequest|クライアントのブラウザへデータを送信する直前に発生|
|18|PreSendRequestHeaders|HTTP ヘッダーをクライアントに送信する直前に発生|
|19|PreSendRequestContent|コンテンツをクライアントに送信する直前に発生|

***参考 [#b5694965]
-ASP.NET のイベント発生順序 – MiYABiS note.~
http://note.miyabis.jp/2009/11/33503965.html

*書き換え [#q8503f50]
-URLの書き換えはHttpHandlerでも可能のようだが、
-その他の書き換え処理は、要求パイプラインに~
モジュールを「プラグイン」できるHttpModuleを使うことが多い模様。

**URL(Request) [#occ44c06]
URLの書き換えは、
-HttpHandlerか、
-要求パイプライン中のApplication_BeginRequestハンドラで(HttpApplication、HttpModule)

行う。

-参考
--URL書き換え(Rewriting)を行う - Netplanetes~
http://www.pine4.net/Memo/Article/Archives/11

**ResponseBody [#ld452c0e]
ResponseBodyの書き換えは、HttpModuleでResponse.Filterにデコレートされた~
ResponseStreamを設定することで行う(HttpApplication、HttpModule)。

-参考
--HttpRequestのパラメータに小細工をしたい時にどうするか(・ω・)? -うさ☆うさ日記~
http://d.hatena.ne.jp/machi_pon/20091203/1259842545

**ResponseHeader [#ca190294]
ResponseHeaderの書き換えは、~
要求パイプライン中のPreSendRequestHeadersハンドラで行う(HttpApplication、HttpModule)。

-参考
--IIS7 の機能を拡張してみる-レスポンスヘッダー内のサーバー名の改ざん – monoe's blog~
https://blogs.msdn.microsoft.com/osamum/2010/04/05/iis7-2/
--IIS 7/7.5 で不要なHTTPレスポンスヘッダーを削除 « Fukui Labs~
http://blog.progfast.jp/labs/index.php/arts/iis-7-httpresponseheader/

**参考 [#h7d2abfd]
-ブログ表示(3) -クラスライブラリ | ++C++; // 未確認飛行 C~
http://ufcpp.net/study/dotnet/aspx/blog3/
-URLのリダイレクト~
http://uchukamen.com/ASPNET20/URLRedirect/index.htm


----
Tags: [[:.NET開発]], [[:ASP.NET]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS