asp.Net処理フロー

13903 ワード

原文:http://www.cnblogs.com/wupeiqi/archive/2013/03/03/2941295.html
作業プロセス:
iisでは、ワークプロセス(w 3 wp.exe)がaspを実行する.Netアプリケーション、管理してすべての要求に応答して、asp.Netのすべての機能はワークプロセスで実行され、リクエストが来るとワークプロセスはrequestとresponseに関する情報を生成します.
アプリケーションプール:
アプリケーション・プールは、ワークプロセスのコンテナです.通常、異なる構成のワークプロセスを分離するために使用されます.1つのプログラムがエラーまたはプロセスリソースが回収された場合、他のプールのプログラムは影響を受けません.
asp.net 处理流程
注意:1つのアプリケーション・プールに複数のワーク・プロセスが含まれている場合、web gardenと呼ばれます.
iis 6の構造を見ると、彼を2つの部分に分けることができます.
カーネルモジュール
ユーザモジュール(user model)
カーネルモードはiis 6.0から導入され、httpというものが含まれている.Sysのファイルは、リクエストが来るたびに、まずファイルの応答をトリガーします.
asp.net 处理流程
http.Sysは要求を対応するアプリケーションプールに転送する責任を負うが、http.Sysはどのようにしてそのアプリケーションプールに伝えるべきか知っていますか?もちろんランダムではありませんが、アプリケーションプールを作成するたびに、そのプールのIDがhttpで生成されます.Sysファイルに登録されているので、そのプログラムプールにリクエストを送信することを決定できます.
asp.net 处理流程
以上がIIS処理要求の第一歩である.次に、HTTPからリクエストする方法を見てみましょう.SYSはアプリケーションプールに転送されます.
iisユーザモジュール(user model)では、httpからWAS(web admin services)を介して.Sysはリクエストを受信し、アプリケーションプールに転送します.
asp.net 处理流程
アプリケーション・プールがリクエストを受信すると、ワーク・プロセス(w 3 wp.exe)に渡され、リクエストのURL接尾辞がチェックされ、そのISAPI拡張子がロードされたことを決定し、適切なISAPI拡張子にリクエストが渡される.
ASP.NET処理がマッピングするファイル拡張子、例えば.aspx、.ascx、.ashxと.asmx.
すなわち、ファイルが上記接尾辞である場合には、ASPをロードする.NETのISAPI拡張(aspnet_isapi.dll)
asp.net 处理流程
ワークプロセスがaspnet_をロードするとisapi.dllは、アプリケーションのエントリであるHttpRuntimeクラス(派生防止クラス)を構築します.このクラスのProcessRequest()メソッドによってHttpContextクラスを作成し、ProcessRequestメソッドに入った後、内部で一連のメソッドをトリガーし、最終的にHttpContextインスタンスを作成します(HttpContext.Currentでこのインスタンスを取得できます).このインスタンスはライフサイクル全体で生存します. 
その後、HttpRuntimeクラスはHttpApplicationFactoryクラスに要求を提出し、HttpApplicationオブジェクトを返すように要求し、HttpApplicationFactoryは要求を受け取った後、すでに存在し、空いているオブジェクトがあるかどうかをチェックし、ある場合はHttpApplicationオブジェクトを取り出してHttpRuntimeクラスに戻り、ない場合はHttpRuntimeクラスに渡すように作成します.
HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context)HttpApplicationインスタンスを作成して初期化し、Systemを呼び出す.Web.HttpApplication.InitInternal()メソッド.
リクエストが来るたびにhttpModuleを通ってhttphandlerに到着し、応答する.httpmoduleはhttpApplicationに構成されています.
 
HttpApplicationインスタンスを作成すると、インスタンスを呼び出すInitInternalメソッドになります.
InitInternalメソッドの主な機能は次のとおりです.
1.HttpAplicationオブジェクトが初期化されると、まずInitModuleメソッドを呼び出してWebをロードする.configファイルで構成されているすべてのHttpModuleモジュール.
例:
//Web.Config   

<System.web>

    <httpModules>

            <add name="MyModuleName"  type="MyModule">

    </httpModules>

</System.web>



//      (  )



public class MyModule:IHttpModule

{

    public MyModule()

    {

        //

        // TODO:            

        //

    }



    #region IHttpModule   



    public void Dispose()

    {

       

    }



    public void Init(HttpApplication context)

    {

        context.BeginRequest += new EventHandler(Mycontext_BeginRequest);

    }



    private void Mycontext_BeginRequest(object sender, EventArgs e)

    {

         //    

         HttpContext.Current.Response.Write("BeginRequest11111111111111</br>"+dt);

    }

    #endregion

}

2.次にH o k e v e n t h a n d l e s ForApplicationAndModulesメソッドが呼び出され、このメソッドはGlobalを完了する.asaxファイルで構成されているHttpModuleまたはHttpApplicationのバインディング.
例:
//Global.asax  

 void MyModule_ExposedEvent(object sender, EventArgs e)

 {

      Response.Write("xixi");

 }
//MyModule.cs  

public class MyModule:IHttpModule

 {

     public event EventHandler ExposedEvent;//HttpModule  , Global.asax   

 

     public void Init(HttpApplication context)

     {

         context.BeginRequest += new EventHandler(context_BeginRequest);//  HttpApplication   

     }

 

     void context_BeginRequest(object sender, EventArgs e)

     {

         HttpContext.Current.Response.Write("BeginRequest");

         OnExposedEvent(new EventArgs());//  HttpModule     

     }

 

     protected void OnExposedEvent(EventArgs e)

     {

         if (ExposedEvent != null)

         {

             ExposedEvent(this, e);

         }

     }

 

     public void Dispose()

     {

     }

 }

   MyModule_ExposedEvent         MyModule  ExposedEvent  。

3、最後にApplicationStepManageオブジェクトのBuildStepsメソッドが呼び出され、HttpApplicationイベントのバインドが完了します.
4.HttpApplicationの各イベントを順番に実行します.すなわち、先に登録された要求を処理またはチェックするHttpModuleモジュールの内容も実行される.
これらのイベントのうち、10番目のイベント「要求されたリソースのファイル拡張子(アプリケーションのプロファイルにマッピング)に基づいて、IHttpHandlerを実装するクラスを選択し、要求を処理する」というイベントも、HttpHandlerが作成した場所です.
 
-----------------------------------------------------------------
前に私たちはずっとASPについて話していました.NETパイプライン、では、誰がパイプラインのプロセスを制御していますか?答えは:HttpApplicationオブジェクトです.1.HttpApplicationは、その処理プロセスを細分化し、異なる段階で異なるイベントを開始し、HttpModuleがイベントを購読することによって要求の処理プロセスに参加するようにする.2.要求の処理過程において、HttpApplicationオブジェクトは主に処理フローを制御する推進作用を果たす.3.HttpApplicationは、一定の段階でIHttpHandlerインスタンスを取得し、要求された応答プロセスを特定のIHttpHandlerに渡して実装する.
HttpApplicationはどのように生成され、どのように動作しますか?1.HttpApplicationオブジェクトは再利用され、HttpRuntimeがHttpApplicationFactoryから空きインスタンスを取得できない場合に作成されます.2.HttpRuntimeは、各要求を1つのHttpApplicationオブジェクトに渡して処理します.3.HttpApplicationオブジェクトは、初期化時にすべてのHttpModuleをロードします.4.各HttpApplicationオブジェクトは、それに属するパイプラインプロセスを制御します.
HttpApplicationは非常に重要なタイプで、その多くの機能はフレームワークの基礎部分に属しており、呼び出す必要はありません.そのため、私たちは普段それを使用しません.
 
-------------------------------------------------------------------------
HttpHandlerは、ユーザが要求したファイルの拡張子(.aspx,.ascx,.ashx,.asmx)に従って要求を処理する.
HttpApplicationは、ある要求をHttpHandlerインスタンスに渡して処理する場合、インタフェースを介して適切なHttpHandlerクラスにおけるProcessRequestメソッドを呼び出して要求を処理する.
たとえば、要求を処理するHttpHandlerを自分で定義します.(実はHttpHandlerはIHttpHandlerインタフェースしか実現していないクラス総称)
//Web.Config   

<httpHandlers>

      <add path="*.aspx" verb="*" type="SearchInfo.Handle"/>

      <add path="*.ascx" verb="*" type="SearchInfo.Handle2"/>

</httpHandlers>

//SearchInfo     ,Handle           。

// :     Url    .aspx  ,       Handle    



namespace SearchInfo

{

    /// <summary>

    /// Handle      

    /// </summary>

    public class Handle:IHttpHandler

    {

        public Handle()

        {

            //

            // TODO:            

            //

        }



        #region IHttpHandler   



        public bool IsReusable

        {

            get { throw new Exception("The method or operation is not implemented."); }

        }



        public void ProcessRequest(HttpContext context)

        {

            HttpContext.Current.Response.Write("   Handler    aspx");

        }



        #endregion

    }

}

したがって、HttpHanlder:特定のリクエストに応答するために使用されるHttpHanlderを理解する必要があります.
要求の処理中、HttpApplicationオブジェクトは主にパイプライン処理プロセスを制御する役割を果たし、処理プロセス全体を推進し、異なる段階で異なるイベントを引き起こすほか(HttpModuleで使用する)、HttpApplicationオブジェクトは現在の要求に基づいて適切なIHttpApplicationFactoryインスタンスを探します.そして最終的にIHttpHandlerのインスタンスが要求を処理するために得られる.
应用程序环境图形
リクエストが来るたびにhttpModuleを通ってhttphandlerに到着し、応答する.httpmoduleはhttpApplicationに構成されています.
asp.net 处理流程
プロセスは次のとおりです.
Webサーバ上の何らかの情報を要求するたびに、その要求はまずHttpに到達する.SYS、そしてHttp.SYSは、対応するアプリケーション・プールに送信し、アプリケーション・プールがワーク・プロセスに渡され、ISAPI拡張子がロードされ、HttpRuntimeオブジェクトが作成され、HttpModuleおよびHttpHandlerによって要求が処理されます.
詳細なHttpHandlerとHttpModuleについては、Fish Liのブログで次のことができます.