「[[マイクロソフト系技術情報 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)>#t027c2c5]]、[[HttpModule>#kaf9efb5]]、[[HttpHandler>#w0840a2b]]等について。

*ライフサイクルとイベント発生順序 [#x6b0fbdf]
https://docs.microsoft.com/ja-jp/aspnet/core/migration/http-modules/_static/moduleshandlers.png~
引用:ttps://docs.microsoft.com/ja-jp/aspnet/core/migration/http-modules/_static/moduleshandlers.png

**HttpApplication(Global.asax) [#t027c2c5]
-共通の処理を定義する。
--メソッド
--プロパティ
--イベント

-Global.asax ファイルで定義する。

-[[ライフサイクル>#s4cd94aa]]

**HttpModule [#kaf9efb5]
要求を傍受、参加、または変更できる。
-[[HttpHandler>#w0840a2b]]の実行前と実行後に呼び出される。
-インターフェイス IHttpModule を実装する。

-[[ライフサイクル>#s4cd94aa]]

**HttpHandler [#w0840a2b]
[[ISAPI>ISAPI、HttpPlatformHandler#u77f13ce]]拡張機能に類似した機能。
-個々のエンドポイント要求を処理するために使用する。
-要求を処理するために使用されるハンドラーは 1 つのみ。
-インターフェイス IHttpHandler を実装する。
-アプリ内の HTTP URL または URL 拡張機能のグループを処理できる。

-[[ライフサイクル>#ae794ab7]]

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

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

**ライフサイクル [#kac2a827]
***HttpApplication(Global.asax)、HttpModule [#s4cd94aa]

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

-参考
--[INFO] ASP.NET のアプリケーション インスタンス、アプリケーション イベント、およびアプリケーション状態~
https://support.microsoft.com/ja-jp/help/312607/info-application-instances--application-events--and-application-state
-なお、[[HttpApplication>#t027c2c5]]と[[HttpModule>#kaf9efb5]]はアクセスできるイベントが異なる。

***HttpHandler [#ae794ab7]
-リクエストの都度、IHttpHandlerFactoryによって、HttpHandlerをインスタンス化。
-<httpHandlers>の定義に従って、拡張子やGET,POSTなどに応じて適切なHttpHandlerをインスタンス化。
--HttpApplication
---アプリケーションレベルのイベント
---リクエストレベルのイベント

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

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

**イベント発生順序 [#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 ★

**参考 [#b5694965]
-ASP.NETのライフサイクルの仕組み~
http://article.higlabo.com/ja/asp_net_life_cycle.html
-ASP.NET のイベント発生順序 – MiYABiS note.~
http://note.miyabis.jp/2009/11/33503965.html

*主要なイベントの説明 [#abc2a6da]
***主要なイベントの説明 [#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|コンテンツをクライアントに送信する直前に発生|

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

-ブログ表示(3) -クラスライブラリ | ++C++; // 未確認飛行 C~
http://ufcpp.net/study/dotnet/aspx/blog3/
***URL(Request) [#occ44c06]
URLの書き換えは、
-[[HttpHandler>#w0840a2b]]か、
-要求パイプライン中のApplication_BeginRequestハンドラで([[HttpApplication>#t027c2c5]]、[[HttpModule>#kaf9efb5]])

**URL [#occ44c06]
HttpHandlerでも可能のようだが、HttpModuleを使うことが多い模様。
行う。

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

**ResponseBody [#ld452c0e]
-HttpRequestのパラメータに小細工をしたい時にどうするか(・ω・)? -うさ☆うさ日記~
***ResponseBody [#ld452c0e]
ResponseBodyの書き換えは、[[HttpModule>#kaf9efb5]]でResponse.Filterにデコレートされた~
ResponseStreamを設定することで行う([[HttpApplication>#t027c2c5]]、[[HttpModule>#kaf9efb5]])。

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

**ResponseHeader [#ca190294]
-IIS7 の機能を拡張してみる-レスポンスヘッダー内のサーバー名の改ざん – monoe's blog~
***ResponseHeader [#ca190294]
ResponseHeaderの書き換えは、~
要求パイプライン中のPreSendRequestHeadersハンドラで行う([[HttpApplication>#t027c2c5]]、[[HttpModule>#kaf9efb5]])。

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

*参考 [#scbb35e8]
*参考 [#h7d2abfd]

**microsoft.com [#w1fa2170]

***support [#r412a1f4]
-[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

***docs [#xf8dd519]
-HttpApplication クラス (System.Web)~
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpapplication
-IHttpModule インターフェイス (System.Web)~
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.ihttpmodule
-IHttpHandler インターフェイス (System.Web)~
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.ihttphandler

-ASP.NETHTTP モジュールとハンドラー - ASP.NET~
https://docs.microsoft.com/ja-jp/troubleshoot/aspnet/http-modules-handlers
-HTTP ハンドラーとモジュールをミドルウェアに ASP.NET Coreする~
https://docs.microsoft.com/ja-jp/aspnet/core/migration/http-modules

**違い [#k247fbea]

***HttpModuleとHttpHandler [#bf446e40]
-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 [#t8d8d900]
-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

**その他 [#y91234a0]

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

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

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

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


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS