HttpModuleの理解とカスタマイズ
9931 ワード
前言
前編HttpHandlerの理解とカスタマイズに続いて、HttpModuleのさらなる学習が行われ、本編は小結としている.
主な参考:Asp.Netフレームワーク(HttpModule紹介)-Part.3
目次
1. 一体何がHttpModule?
2. システム内部のHttpModule。
3. HttpModuleを設定します。
4. HttpModuleをカスタマイズします。
5. Global.asaxファイルとHttpModule。
一体何がHttpModuleなのか
Asp.Netのイベントは、アプリケーションレベル、ページレベル、コントロールレベルの3つに分けられます.HttpModuleはパイプモデルでAsp.Netのアプリケーションレベルイベントは購読し,アプリケーションレベルイベントがトリガーされるとHttpModuleで対応する処理方法を呼び出す.つまりHttpModuleはAspの購読である.Netアプリケーションレベルのイベントのエントリは、HttpApplicationオブジェクトのライフサイクルの各イベントに依存します.
システム内部のHttpModule
Asp.Net内部の多くの機能は、Windows、Forms、PassPort認証、Sessionメカニズムなど、HttpModule形式で実行されています.以下に、部分的な内部HttpModuleとその役割を示す.
名前
を選択します.
機能
OutputCache
System.Web.Caching.OutputCacheModule
ページレベル出力キャッシュ
Session
System.Web.SessionState.SessionStateModule
セッション状態管理
WindowsAuthentication
System.Web.Security.WindowsAuthenticationModule
統合Windows認証によるクライアント認証
FormsAuthentication
System.Web.Security.FormsAuthenticationModule
Cookieベースのフォーム認証によるクライアント認証
PassportAuthentication
System.Web.Security.PassportAuthenticationModule
MSパスポートによる顧客認証
RoleManager
System.Web.Security.RoleManagerModule
現在のユーザーロールの管理
UrlAuthorization
System.Web.Security.UrlAuthorizationModule
ユーザーがURLへのアクセスを許可されているかどうかを判断します.
FileAuthorization
System.Web.Security.FileAuthorizationModule
ユーザーがリソースへのアクセスを許可されているかどうかを判断します.
AnonymousIdentification
System.Web.Security.AnonymousIdentificationModule
管理AspNetアプリケーションでの匿名アクセス
Profile
System.Web.Profile.ProfileModule
ユーザー・ファイルの作成および関連イベントの管理
ErrorHandlerModule
System.Web.Mobile.ErrorHandlerModule
例外のスナップ、エラープロンプト文字のフォーマット、クライアント・プログラムへの渡す
HttpModuleの構成
カスタムHttpModuleはカスタムHttpHandlerと似ていて、webにあります.configファイルで構成します.形式は次のとおりです.
1.type:HttpHandlerと同様に、2つの部分で構成されています.第1の部分は完全なクラス名(ネーミングスペース名を含む)、第2の部分は所在するプログラムセット名(.dllを含まない)です.
2.name:HttpModuleの名前で、クラス名に関係なく使用できます.HttpApplicationオブジェクトのModulesプロパティでHttpModuleCollectionを取得し、nameで対応するHttpModuleオブジェクトを取得します.Globalでasaxのメソッド名ModuleName_EventNameはHttpModuleのイベントを購読します.ここではMM_です.具体的なイベント名は、以下の例を参照してください.
3.ワークプロセスに入るリクエストごとに、各構成済みのHttpModuleの処理が行われるため(HttpModuleはアプリケーション・レベルのイベントを購読するため)、プロファイルにはpathとverb属性はありません(*.aspxでも*.ashxでもgetでもpostでも処理されます).
注意:HttpModuleの構成は、HttpHandlerのようにIIS上で構成する必要はありません.
カスタムHttpModule
各HttpModuleはSystemを継承する.Web.IHttpModuleインタフェースは,インタフェースのInit(HttpApplication context)とDispose()メソッドを実現する.次のようになります.
Init():このメソッドはHttpApplicationオブジェクトを受け入れ、HttpApplicationは現在のアプリケーションを表し、このメソッド内でHttpApplicationオブジェクトがクライアントに露出したイベントを購読する必要があります.この方法はイベントのサブスクリプションにのみ使用され,実際のイベントハンドラでは,別の方法を書く必要があることがわかる.
Dispose():ゴミ回収前に資源を解放する.
プロセス全体がよく理解されています.サイトの最初のリソースがアクセスするとき、Asp.Netは、サイトアプリケーションを表すHttpApplicationクラスのインスタンスを作成し、Webにすべて作成します.Configに登録されているModuleインスタンス. Moduleインスタンスの作成時にModuleのInit()メソッドが呼び出されます. Init()メソッド内で、応答したいHttpApplicationが暴露したイベントを登録する.(メソッドの簡単な登録を行うだけで、実際のメソッドは別途書く必要があります). HttpApplicationは、アプリケーションサイクル中に様々なイベントをトリガーします. イベントがトリガーされると、ModuleがInit()メソッドに登録したメソッドが呼び出されます.
依頼について参照:依頼とイベント
asp.Netでは、GlobalはアプリケーションやSessionイベントだけでなく、Http Moduleが暴露したイベントも登録できます.システムModuleのイベントを登録するだけでなく、私たちの意味のModuleが暴露したイベントを登録することもできます.具体的に説明する前に、ここではまず2つの点に注意する必要があります. Httpリクエストを処理するたびにアプリケーションイベントがトリガーされますが、Application_StartとApplication_End例外は、最初のリソースファイルがアクセスされたときにのみトリガーされます. Http Module Sessionイベントの登録と応答ができません.Session_スタートとセッションEnd、Glabalしか通らない.asaxで処理します.
次の例に進みます.
MyModule.csファイル
Global.asaxファイル
上のMyModule_ExposedEventメソッドは、MyModuleのExposedEventイベントを自動的に購読します.具体的な実現メカニズムは研究する必要がある!
前編HttpHandlerの理解とカスタマイズに続いて、HttpModuleのさらなる学習が行われ、本編は小結としている.
主な参考:Asp.Netフレームワーク(HttpModule紹介)-Part.3
目次
1. 一体何がHttpModule?
2. システム内部のHttpModule。
3. HttpModuleを設定します。
4. HttpModuleをカスタマイズします。
5. Global.asaxファイルとHttpModule。
一体何がHttpModuleなのか
Asp.Netのイベントは、アプリケーションレベル、ページレベル、コントロールレベルの3つに分けられます.HttpModuleはパイプモデルでAsp.Netのアプリケーションレベルイベントは購読し,アプリケーションレベルイベントがトリガーされるとHttpModuleで対応する処理方法を呼び出す.つまりHttpModuleはAspの購読である.Netアプリケーションレベルのイベントのエントリは、HttpApplicationオブジェクトのライフサイクルの各イベントに依存します.
システム内部のHttpModule
Asp.Net内部の多くの機能は、Windows、Forms、PassPort認証、Sessionメカニズムなど、HttpModule形式で実行されています.以下に、部分的な内部HttpModuleとその役割を示す.
名前
を選択します.
機能
OutputCache
System.Web.Caching.OutputCacheModule
ページレベル出力キャッシュ
Session
System.Web.SessionState.SessionStateModule
セッション状態管理
WindowsAuthentication
System.Web.Security.WindowsAuthenticationModule
統合Windows認証によるクライアント認証
FormsAuthentication
System.Web.Security.FormsAuthenticationModule
Cookieベースのフォーム認証によるクライアント認証
PassportAuthentication
System.Web.Security.PassportAuthenticationModule
MSパスポートによる顧客認証
RoleManager
System.Web.Security.RoleManagerModule
現在のユーザーロールの管理
UrlAuthorization
System.Web.Security.UrlAuthorizationModule
ユーザーがURLへのアクセスを許可されているかどうかを判断します.
FileAuthorization
System.Web.Security.FileAuthorizationModule
ユーザーがリソースへのアクセスを許可されているかどうかを判断します.
AnonymousIdentification
System.Web.Security.AnonymousIdentificationModule
管理AspNetアプリケーションでの匿名アクセス
Profile
System.Web.Profile.ProfileModule
ユーザー・ファイルの作成および関連イベントの管理
ErrorHandlerModule
System.Web.Mobile.ErrorHandlerModule
例外のスナップ、エラープロンプト文字のフォーマット、クライアント・プログラムへの渡す
HttpModuleの構成
カスタムHttpModuleはカスタムHttpHandlerと似ていて、webにあります.configファイルで構成します.形式は次のとおりです.
1 <HttpModules>
2 <add name="MM" type="MyModule,MMAssembly"/>
3 </HttpModules>
1.type:HttpHandlerと同様に、2つの部分で構成されています.第1の部分は完全なクラス名(ネーミングスペース名を含む)、第2の部分は所在するプログラムセット名(.dllを含まない)です.
2.name:HttpModuleの名前で、クラス名に関係なく使用できます.HttpApplicationオブジェクトのModulesプロパティでHttpModuleCollectionを取得し、nameで対応するHttpModuleオブジェクトを取得します.Globalでasaxのメソッド名ModuleName_EventNameはHttpModuleのイベントを購読します.ここではMM_です.具体的なイベント名は、以下の例を参照してください.
3.ワークプロセスに入るリクエストごとに、各構成済みのHttpModuleの処理が行われるため(HttpModuleはアプリケーション・レベルのイベントを購読するため)、プロファイルにはpathとverb属性はありません(*.aspxでも*.ashxでもgetでもpostでも処理されます).
注意:HttpModuleの構成は、HttpHandlerのようにIIS上で構成する必要はありません.
カスタムHttpModule
各HttpModuleはSystemを継承する.Web.IHttpModuleインタフェースは,インタフェースのInit(HttpApplication context)とDispose()メソッドを実現する.次のようになります.
1 public class MyModule:IHttpModule
2 {
3
4 public void Init(HttpApplication context)
5 {
6 context.BeginRequest += new EventHandler(context_BeginRequest);
7 }
8
9 void context_BeginRequest(object sender, EventArgs e)
10 {
11 HttpContext.Current.Response.Write("BeginRequest");
12 }
13
14 public void Dispose()
15 {
16 }
17 }
Init():このメソッドはHttpApplicationオブジェクトを受け入れ、HttpApplicationは現在のアプリケーションを表し、このメソッド内でHttpApplicationオブジェクトがクライアントに露出したイベントを購読する必要があります.この方法はイベントのサブスクリプションにのみ使用され,実際のイベントハンドラでは,別の方法を書く必要があることがわかる.
Dispose():ゴミ回収前に資源を解放する.
プロセス全体がよく理解されています.
依頼について参照:依頼とイベント
Global.asaxファイルとHttpModule
asp.Netでは、GlobalはアプリケーションやSessionイベントだけでなく、Http Moduleが暴露したイベントも登録できます.システムModuleのイベントを登録するだけでなく、私たちの意味のModuleが暴露したイベントを登録することもできます.具体的に説明する前に、ここではまず2つの点に注意する必要があります.
次の例に進みます.
MyModule.csファイル
1 public class MyModule:IHttpModule
2 {
3 public event EventHandler ExposedEvent;//HttpModule , Global.asax
4
5 public void Init(HttpApplication context)
6 {
7 context.BeginRequest += new EventHandler(context_BeginRequest);// HttpApplication
8 }
9
10 void context_BeginRequest(object sender, EventArgs e)
11 {
12 HttpContext.Current.Response.Write("BeginRequest");
13 OnExposedEvent(new EventArgs());// HttpModule
14 }
15
16 protected void OnExposedEvent(EventArgs e)
17 {
18 if (ExposedEvent != null)
19 {
20 ExposedEvent(this, e);
21 }
22 }
23
24 public void Dispose()
25 {
26 }
27 }
Global.asaxファイル
1 void MyModule_ExposedEvent(object sender, EventArgs e)
2 {
3 Response.Write("xixi");
4 }
上のMyModule_ExposedEventメソッドは、MyModuleのExposedEventイベントを自動的に購読します.具体的な実現メカニズムは研究する必要がある!