HttpModule



asp.NetでダウンロードしたcommunityStarterKitは、長い間ページがどのようにジャンプを実現しているのか分からないことを研究していましたが、そのハイパーリンクは見つかりませんでした.最後にブレークポイント追跡を行い、やっとCommunitiesModuleクラスを見つけ、IHttpModuleから継承されていることを発見し、プロジェクトでCommunitiesModuleを検索し、ついにwebconfigを発見した.xmlにはそしてヘルプを見て、インターネットで検索して、やっと分かりました...ASP.NetにおけるカスタムHttp処理およびアプリケーションのHttpModule編著者:孫亜民HttpHandlerはISAPI Extentionのような機能を実現し、要求(Request)の情報と送信応答(Response)を処理する.HttpHandler機能の実装は、IHttpHandlerインターフェースを実装することによって達成される.一方、HttpModuleはISAPI Filterのような機能を実現している.HttpModuleの実装HttpModulesはISAPI Filterのような機能を実装しており、開発には通常以下のステップが必要である:1.IhttpModuleインタフェース2を実装クラスを作成する.Initメソッドを実装、必要なメソッド3を登録する.登録を実現する方法4.Disposeメソッドを実装するには、クラスのパージを手動で行う必要がある場合は、Disposeメソッドの実装を追加できますが、これは必須ではありません.通常、Disposeメソッドにコードを追加しなくてもいいです.5.Web.configファイルでは、作成したクラスを登録する以下に、HttpModulesの例を示します.この例では、HttpApplicationのBeginRequestとEndRequestイベントを簡単に登録し、これらのイベントの実装方法で関連情報を印刷します.

        
          1:
         
using System;
using System.Web;
namespace MyModule
{
public class MyModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest += (new
EventHandler(this.Application_BeginRequest));
application.EndRequest += (new
EventHandler(this.Application_EndRequest));
}
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication Application = (HttpApplication)source;
HttpResponse Response=Application.Context.Response;
Response.Write("<h1>Beginning of Request</h1><hr>");
}
private void Application_EndRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpResponse Response=Application.Context.Response;
Response.Write("<h1>End of Request</h1><hr>");
}
public void Dispose()
{
}
}
}

プログラムの開始は、次の名前空間を参照します.

        
         using System;
         
using System.Web;

HttpApplication、HttpContext、HttpResponseなどがSystemにあるためである.Webで定義されているので、System.Webネームスペースは参照する必要があります.MyModuleクラスはIhttpModuleインタフェースを実現した.Initメソッドでは、BeginRequestおよびEndRequestイベントを実装する方法が示されている.この2つの方法では,単純にそれぞれいくつかの情報を印刷しただけである.以下、Web.configファイルにこのクラスを登録すると、このHttpModuleを使用できます.登録の方法は以下の通りです.

        
         <configuration>
         
<system.web>
<httpModules>
<add name=" MyModule " type=" MyModule, MyModule" />
</httpModules>
</system.web>
</configuration>

今、効果を見てみましょう.Aspxページを作成します.aspx、内容は以下の通りです.

        
         <%
         
Response.Write("<h1>This is the Page</h1><hr>");
%>

実行後のインタフェースは、図のように、HttpModule HttpModuleがHttpApplicationオブジェクトの一連のイベントの処理によってHTTP処理パイプに影響を与えることを深く研究し、これらのイベントはHttpModuleのInitメソッドに登録されている.

        
         BeginRequest
         
AuthenticateRequest
AuthorizeRequest
ResolveRequestCache
AcquireRequestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
UpdateRequestCache
EndRequest

一部のイベントはGlobal.asaxのイベントに対応し、対応関係は以下の通りです.
HttpModule
Global.asax
BeginRequest
Application_BeginRequest
AuthenticateRequest
Application_AuthenticateRequest
EndRequest
Application_EndRequest
例1では,BeginRequestとEndRequestイベントが処理されており,他のイベントの処理方式は基本的に類似している.HttpHandlerに対応してみると,これらのイベントは,HttpHandlerの前に発生するものもあれば,HttpHandlerの処理が完了した後に発生するものもある.サーバ側のオブジェクトが異なる期間に異なる表現を持つため、イベントの発生順序を知ることが重要です.例の1つはセッションの使用です.すべてのイベントでSessionを処理できるわけではありませんが、限られたいくつかのイベントでしか処理できません.詳細な手順は、以下のHTTP Request処理ライフサイクルチャートを参照してください.HttpModuleを使用してパーミッションシステムを実装アプリケーションシステムを開発する際、アプリケーションシステムのパーミッション制御は非常に重要な部分です.ASPでは、制御権限が必要なASPページごとに権限制御コードを追加し、お客様のページへのアクセスを制御する必要があるため、権限の制御を実現するのは面倒です.このような問題は、多数の重複コードを記述するほか、権限制御部と業務処理部のモジュールが緊密に結合されているため、権限制御モジュールの修正は、多くの修正作業をもたらし、大量のBugをもたらすことが多い.したがって,権限制御とビジネス処理モジュールをデカップリングし,互いに影響を及ぼさず,あるいは影響を最小限に抑えることができるようにする必要がある.Jspプログラムでは、この目的は、フロントエンドコントローラを導入することによって権限フィルタリングを実現することができる(フロントエンドコントローラモードについては、『J 2 EEコアモード一書』を参照).ASP.Netでは、HttpModuleを利用して同様の効果を実現できます.実現の過程を見てみましょう.まず、あるユーザがモジュール機能にアクセス権を持っているかどうかを検出する権限処理システムを構築します(具体的な構造では、読者はこの部分のプログラミングに触れたことがあるので、後述しないと思います).クライアントに呼び出された権限検証クラスの定義は以下の通りです.

        
         public class RightChecker
         
{
public static bool HasRight(User user,Module module)
{
// ,
}
}

次に、HttpModuleを使用してフィルタを作成します.

        
         using System;
         
using System.Web;
namespace MyModule
{
public class MyModule : IHttpModule
{
public void Init(HttpApplication application)
{
application. AcquireRequestState += (new
EventHandler(this.Application_AcquireRequestState));
}
private void Application_AcquireRequestState (Object source,
EventArgs e)
{
HttpApplication Application = (HttpApplication)source;
User user=Application.Context.Sesseion["User"] // User
string url=Application.Context.Request.Path;
//
Module module= // url
If(!RightChecker.HasRight(user,module))
Application.Context.Server.Transfer("ErrorPage.aspx");
// ,
}
public void Dispose()
{
}
}
}

このクラスを前述の方法に従ってWeb.Configに登録すると、私たちのアプリケーションシステムは権限管理の機能を備えています.どうですか.元の方法よりずっといいですね.