mvcソースコード解読(3)-拡張:asp.Netの2大コアコンポーネントHttpModule&&HttpHandler

6183 ワード

前の2つの文章の中で、私たちはmvcソースコードの階層からmvcが実行するいくつかの前期の準備作業を解析しただけで、この文章は私たちは再び1つのHTTP要求がどのようにIISサーバーにあるかを深く検討します.Net FrameWork環境で解析され、クライアントに返されます.クライアント要求を処理する際には、IISサーバと.NetFrameWork環境.IISサーバは非管理環境で動作Asp.Netパイプは管理環境下であり,両者の間にISAPIインタフェースを介して連通している.私も前にmvcについて話したことがありますが、実はaspを歩いています.Netパイプラインは、UrlRoutingModuleにIHttpModuleインタフェースを実装させ、InitにPostResolveRequestCacheイベントを登録しただけで、HTTPリクエストを処理するプロセッサがWebFormモードのページクラスのプロセッサや一般的なプロセッサではなく、MvcHandlerプロセッサになるように拡張されています.同時に、後期はページライフサイクルを実行してコントロールツリーを作成するのではなく、ビューエンジンを通じて処理後の結果をユーザーに返します.
クライアントの要求はIISの簡単な処理を経て入る.NetFrameWork環境では、ISAPIruntimeが現在のHTTPリクエストを引き継ぐ、ISAPIruntimeはまず、現在のHTTPリクエストをカプセル化するためのWorkRequestオブジェクトを作成し、同時にWorkRequestオブジェクトをAspに渡す.NetランタイムHttpRuntimeは、ここでHTTPリクエストが正式にAspに入ったことを意味する.Netパイプ、Asp.Netイベントパイプには、HttpModuleフィルタとHttpHanlderプロセッサの2つの重要なコンポーネントが含まれています.一つ一つ紹介しましょう.
まず、HttpModuleを見てみましょう.実は、HttpModuleでもHttpHandlerでも、ある種類のフィルタとプロセッサを表す総称にすぎません.すべてのHttpModuleは、次のように定義されたIHttpModuleインタフェースを実装する必要があります.
public interface IHttpModule

{

    // Methods

    void Dispose();

    void Init(HttpApplication context);

}


任意のパイプイベントを購読でき、各フェーズのリクエストを変更し、変更後のリクエストをHttpHandlerプロセッサに渡す能力があるため、リクエストの処理に影響を与える可能性があります.これは主に各HttpHandlerがインタフェース内のInit()を実現しなければならないことに現れている.ウェブアプリケーションが起動すると、まずプロファイルでノードを読み出し、対応するHttpModuleプロセッサを取得し、HttpModule内のInit()メソッドを呼び出してサブスクリプションイベントの目的を実現するからである.くだらないことは言わないで、URLの書き換えの例を挙げてHttpModuleの使い方を説明しましょう.次のコードに示すように、Httpmodule---MyUrlModuleをカスタマイズし、IHttpModuleインタフェースを実装します.
          public class MyUrlModule:IHttpModule              {                  public void Init(HttpApplication context)                          {                         context.BeginRequest += context_BeginRequest;                         }         void context_BeginRequest(object sender, EventArgs e)                  {                          HttpApplication app = sender as HttpApplication;                          app.Context.Response.ContentEncoding = System.Text.Encoding.UTF8;                          app.Context.Response.ContentType = "text/html";              app.Context.Response.Write(「元のパス:」+app.Context.Request.Url.AbsolutePath);//元のパス:NewsPage.aspx/id/4をNewsPageに変換する.aspx?Id=4--すなわちURL書き換えの本質://元のパスを得る---メッセージが渡されたURL string sourcePath=appを要求する.Context.Request.Url.AbsolutePath+"/id/4";//URLを分割string[]urls=sourcePath.Split('/');//クラス名と接尾辞名string strClassName=urls[1];                        string[] strClassAndExtend = strClassName.Split('.');//クラス名string className=strClassAndExtend[0];//接尾辞名string extend=strClassAndExtend[1];//渡されたパラメータstring strParas=urlsを取得する[2];//渡されたパラメータ値string strParasValue=urls[3];//偽装静的ページを動的ページappに変換する.Context.RewritePath(className+"."+"aspx"+ "?"+ strParas + "="+ strParasValue);                }
同時にHttpModuleはWeb.コンフィギュレーションファイルの設定は次のとおりです.
                           
これにより,webプログラムの初期化時や要求処理時にHttpModuleのInitイベントが呼び出されるので,ここでは特に注意が必要である:Asp.Netでは、.js,.cssやimgなどのリソースのみを含むパイプに到達するリクエストごとにHttpApplicationオブジェクトが作成され、HttpApplicationオブジェクトが初期化されるとWebがロードされます.Configに登録されているHttpModuleノード.そしてAsp.Netで作成されたHttpApplicationオブジェクトは一意ではありません.つまり、HttpModuleのInitメソッドが複数回呼び出される可能性があるため、初期化のような操作には適していません.もう一つ注意しなければならないのは、Httpmoduleのために適切なパイプイベントを購読することです.私は以前、プロジェクト開発の時に、Seesionを利用してユーザーのログインの有無を判断していましたが、当時はBeginRequestイベントを購読していましたが、どのように操作しても予想した効果は表示されませんでした.後になって、PostAcquireRequestStateとPostRequestHandlerExecuteイベントでページクラスのSessionオブジェクトがロードされ始めたことに気づき、BeginRequestイベントでユーザー登録の判断ができなくなった.
HttpHandlerプロセッサを見てみましょう.すべてのHttpHandlerはIHttpHandlerインタフェースを実現しています.HttpHandlerはすべてのリクエストを処理するコアオブジェクトです.ほとんどの要求はPostMapRequestHandlerイベントにおいてHttpHandlerオブジェクトにマッピングする、PreRequestHandlerExecuteイベントにおいて処理を実行するため、WebFormモードにおける一般的な処理プログラムのように、このようなオブジェクトを処理プログラムと呼ぶことも多い.ashxとPageはプロセッサです.個人的には一般的なプロセッサだと思います.ashxファイルは純粋なプロセッサのようなもので、WebFormプログラミングでは、一般的なプロセッサを使用する確率が高く、簡潔で効率的で、jsまたはAjaxでどの一般的なプロセッサが私たちの要求を処理するかを直接指定することができます.もちろん、独自のHttphandlerプロセッサを作成し、自分で定義したHttphandler処理に要求を渡すこともできます.そうすれば、Webにいなければなりません.Configにプロセッサを登録します.
      
では、mvcではHttpHandlerプロセッサがMvcHandlerであり、その処理要求によってmvcが実現される.
HttpHandlerについての理解はまだ十分ではありませんが、愚見を書いて、一緒に勉強してください~~~~