ホームページ  >  記事  >  バックエンド開発  >  ASP.NET MVC5 要求処理パイプラインとライフサイクルに関する詳細なチュートリアル

ASP.NET MVC5 要求処理パイプラインとライフサイクルに関する詳細なチュートリアル

PHPz
PHPzオリジナル
2017-04-23 16:29:052790ブラウズ

リクエスト処理パイプライン

リクエスト パイプラインは、HTTP リクエストの処理に使用されるモジュールの組み合わせです。ASP.NET では、リクエスト パイプラインには、IHttpModuleIHttpHandler という 2 つのコア コンポーネントがあります。 コード>。すべての HTTP リクエストは <code>IHttpHandler に入り、IHttpHandler が最終処理を実行し、IHttpModuleHttpApplication オブジェクトをサブスクライブします。イベントの場合、IHttpHandler が HTTP リクエストを処理する前にリクエストを前処理することも、IHttpHandler が HTTP リクエストを処理した後にリクエストを再処理することもできます。 IHttpModuleIHttpHandler。所有的HTTP请求都会进入IHttpHandler,有IHttpHandler进行最终的处理,而IHttpModule通过订阅HttpApplication对象中的事件,可以在IHttpHandler对HTTP请求进行处理之前对请求进行预处理或IHttpHandler对HTTP请求处理之后进行再次处理。

在IIS7之前,如IIS6或IIS5,请求处理管道分为两个:IIS请求处理管道和ASP.NET管道,若客户端请求静态资源则只有IIS管道进行处理,而ASP.NET管道不会处理该请求。从IIS7开始两个管道合二为一,称为集成管道。


上图中主要描述ASP.NET运行时对HTTP请求的处理且不涉及太多细节。

HttpApplication与HttpModule

HTTP请求由ASP.NET运行时接管之后,HttpRun<a href="http://www.php.cn/wiki/1268.html" target="_blank">time</a>会利用HttpApplicationFactory创建或从HttpApplication对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication对象,同时ASP.NET会根据配置文件来初始化注册的HttpModuleHttpModule在初始化时会订阅HttpApplication中的事件来实现对HTTP请求的处理。

在ASP.NET MVC5中,Global.asax文件中定义了MvcApplication类,继承HttpApplication类:


public class MvcApplication : System.Web.HttpApplication
{    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteTable.Routes.Add("xfhHandler", new Route(           "{controller}/{action}",            new RouteValueDictionary(new Dictionary<string, object>() { ["controller"] = "home", ["action"] = "index" }),            new XfhUrlRouteHandler())
        );        //RouteConfig.RegisterRoutes(RouteTable.Routes);    }
}

Application_Start()方法最先执行,一般在该方法中添加一些配置,如路由注册、全局过滤器的注册等。

Route

一个HTTP请求会经过至少一个HttpModule的处理。UrlRoutingModule是非常重要的模块,它是路由系统的核心。路由系统的职责是从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule根据当前请求的URL和RouteTable中已注册的路由模板进行匹配并返回第一个和当前请求相匹配的路有对象Route,然后根据路有对象获取路由数据对象RouteData(ASP.NET MVC中,路由数据必须包含controller和action的名称),再有RouteData获取IRouteHandler最终有IRouteHandler得到IHttpHandler

HttpHandler

一个HTTP请求最终要进入HttpHanler中进行处理,一次HTTP请求只能被一个HttpHandler进行处理。

Controller

IHttpHandlerProcessRequest方法中对当前请求进行处理,在该方法中通过ControllerBuilder得到IControllerFactory然后通过反射的方式获取Controller的类型。

Action

ASP.NET MVC中ControllerBase是所有Controller的基类,在类型的Execute方法中通过IActionInvokerInvokeAction方法来执行对Action的调用。在ActionIIS6 や IIS5 などの IIS7 より前は、要求処理パイプラインは、IIS 要求処理パイプラインと ASP.NET パイプラインの 2 つに分割されていました。クライアントが静的リソースを要求した場合、IIS パイプラインのみがそれを処理し、ASP.NET が処理します。パイプラインはリクエストを処理しません。 IIS7 以降、2 つのパイプラインは 1 つに結合され、統合パイプラインと呼ばれます。


🎜上の図は、あまり詳細には触れずに、主に ASP.NET ランタイムによる HTTP 要求の処理を説明しています。 🎜

🎜HttpApplication と HttpModule🎜🎜

🎜 HTTP リクエストが ASP.NET ランタイムによって引き継がれた後、HttpRun<a href="http://www.php.cn/wiki/1268.html" target="_blank">time🎜</a> は、HttpApplicationFactory を使用して HttpApplication を作成するか、HttpApplicationから作成します。 > オブジェクト プール (NET の同様のメカニズムには、スレッド プールや 文字列 🎜 保持プールなど) HttpApplication オブジェクトを作成すると、ASP.NET は HttpModule設定ファイル🎜 /code>、HttpModule は、初期化中に HttpApplication のイベントをサブスクライブして、HTTP リクエストを処理します。 🎜🎜ASP.NET MVC🎜5 の Global.asax ファイル内MvcApplication クラスは、HttpApplication から継承されて定義されています。クラス: 🎜


🎜

//数值越小,执行优先级越高public enum FilterScope
{
    Action= 30,
    Controller= 20,
    First= 0,
    Global= 10,
    Last= 100}
🎜Application_Start() メソッドが最初に実行されます。通常、このメソッドには
ルーティング 🎜 登録、グローバル フィルターの登録🎜など🎜

🎜ルート🎜🎜

🎜 HTTP リクエストは、少なくとも 1 つの HttpModule によって処理されます。 UrlRoutingModule は、ルーティング システムの中核となる非常に重要なモジュールです。ルーティング システムの役割は、コントローラ名とアクション名、および
その他の名前を以下から取得することです。リクエスト URL 🎜リクエスト データ。
UrlRoutingModule は、現在のリクエストの URL と RouteTable に登録されているルーティング テンプレートと一致し、現在のリクエストに一致する最初のルート オブジェクトを返しますRoute code> を取得し、ルート オブジェクトに基づいてルート データ オブジェクト <code>RouteData を取得します (ASP.NET MVC では、ルート データにはコントローラーとアクションの名前が含まれている必要があります)。次に RouteData code> は <code>IRouteHandler を取得し、最後に IRouteHandler を取得して IHttpHandler を取得します。 🎜

🎜HttpHandler🎜🎜

🎜 HTTP リクエストは、最終的に HttpHanler に入り、処理されます。 🎜

🎜Controller🎜🎜

🎜IHttpHandler は、ProcessRequest メソッドで現在のリクエストを処理します。このメソッド、IControllerFactoryControllerBuilder を通じて取得され、Controller の型はリフレクションを通じて取得されます。 🎜

🎜アクション🎜🎜

🎜 ASP.NET MVC のControllerBase は、すべての Controller のベースです。 > クラス、タイプの Execute メソッドで、Action への呼び出しは IActionInvokerInvokeAction メソッドを通じて実行されます。 >。 Action が実行される前に、🎜model🎜バインディングとモデル認証の操作が実行されます。 🎜

Filters

在ASP.NET MVC5中有常用的过滤器有5个:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterI<a href="http://www.php.cn/wiki/265.html" target="_blank">Exception</a>Filter
在ASP.NET MVC中所有的过滤器最终都会被封装为Filter对象,该对象中FilterScope类型的
属性Scopeint类型属性<a href="http://www.php.cn/wiki/1360.html" target="_blank">Ord</a>er用于决定过滤器执行的先后顺序,具体规则如下:

  • OrderFilterScope的数值越小,过滤器的执行优先级越高;

  • OrderFilterScope具有更高的优先级,在Order属性值相同时才会被考虑


//数值越小,执行优先级越高public enum FilterScope
{
    Action= 30,
    Controller= 20,
    First= 0,
    Global= 10,
    Last= 100}

ActionResult

Action执行完毕之后会返回ActionResult类型对象作为对此次请求进行处理的结果,对于不是ActionResult类型的返回值,ASP.NET MVC会将其转换为ActionResult类型。

请求生命周期

ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点,请求到达服务器后进入处理管道,至浏览器接收服务器响应时为止。

最后附上一张老外绘制的ASP.NET请求管道图,图片来自《ASP.NET MVC Interview Questions and Answers Book》这本书。


 

课程推荐

php中文网在线Java视频教程

以上がASP.NET MVC5 要求処理パイプラインとライフサイクルに関する詳細なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。