リクエスト パイプラインは、HTTP リクエストの処理に使用されるモジュールの組み合わせです。ASP.NET では、リクエスト パイプラインには、IHttpModule
と IHttpHandler という 2 つのコア コンポーネントがあります。 コード>。すべての HTTP リクエストは <code>IHttpHandler
に入り、IHttpHandler
が最終処理を実行し、IHttpModule
が HttpApplication
オブジェクトをサブスクライブします。イベントの場合、IHttpHandler
が HTTP リクエストを処理する前にリクエストを前処理することも、IHttpHandler
が HTTP リクエストを処理した後にリクエストを再処理することもできます。 IHttpModule
和IHttpHandler
。所有的HTTP请求都会进入IHttpHandler
,有IHttpHandler
进行最终的处理,而IHttpModule
通过订阅HttpApplication
对象中的事件,可以在IHttpHandler
对HTTP请求进行处理之前对请求进行预处理或IHttpHandler
对HTTP请求处理之后进行再次处理。
在IIS7之前,如IIS6或IIS5,请求处理管道分为两个:IIS请求处理管道和ASP.NET管道,若客户端请求静态资源则只有IIS管道进行处理,而ASP.NET管道不会处理该请求。从IIS7开始两个管道合二为一,称为集成管道。
上图中主要描述ASP.NET运行时对HTTP请求的处理且不涉及太多细节。
HTTP请求由ASP.NET运行时接管之后,HttpRun<a href="//m.sbmmt.com/wiki/1268.html" target="_blank">time</a>
会利用HttpApplicationFactory
创建或从HttpApplication
对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication
对象,同时ASP.NET会根据配置文件来初始化注册的HttpModule
,HttpModule
在初始化时会订阅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()
方法最先执行,一般在该方法中添加一些配置,如路由注册、全局过滤器的注册等。
一个HTTP请求会经过至少一个HttpModule
的处理。UrlRoutingModule
是非常重要的模块,它是路由系统的核心。路由系统的职责是从请求URL中获取controller和action的名称以及其它请求数据。UrlRoutingModule
根据当前请求的URL和RouteTable
中已注册的路由模板进行匹配并返回第一个和当前请求相匹配的路有对象Route
,然后根据路有对象获取路由数据对象RouteData
(ASP.NET MVC中,路由数据必须包含controller和action的名称),再有RouteData
获取IRouteHandler
最终有IRouteHandler
得到IHttpHandler
。
一个HTTP请求最终要进入HttpHanler中进行处理,一次HTTP请求只能被一个HttpHandler进行处理。
IHttpHandler
在ProcessRequest
方法中对当前请求进行处理,在该方法中通过ControllerBuilder
得到IControllerFactory
然后通过反射的方式获取Controller
的类型。
ASP.NET MVC中ControllerBase
是所有Controller
的基类,在类型的Execute
方法中通过IActionInvoker
的InvokeAction
方法来执行对Action
的调用。在Action
IIS6 や IIS5 などの IIS7 より前は、要求処理パイプラインは、IIS 要求処理パイプラインと ASP.NET パイプラインの 2 つに分割されていました。クライアントが静的リソースを要求した場合、IIS パイプラインのみがそれを処理し、ASP.NET が処理します。パイプラインはリクエストを処理しません。 IIS7 以降、2 つのパイプラインは 1 つに結合され、統合パイプラインと呼ばれます。
HttpRun<a href="//m.sbmmt.com/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()
メソッドが最初に実行されます。通常、このメソッドには ルーティング 🎜 登録、グローバル フィルターの登録🎜など🎜HttpModule
によって処理されます。 UrlRoutingModule
は、ルーティング システムの中核となる非常に重要なモジュールです。ルーティング システムの役割は、コントローラ名とアクション名、およびその他の名前を以下から取得することです。リクエスト URL 🎜リクエスト データ。 UrlRoutingModule
は、現在のリクエストの URL と RouteTable
に登録されているルーティング テンプレートと一致し、現在のリクエストに一致する最初のルート オブジェクトを返しますRoute code> を取得し、ルート オブジェクトに基づいてルート データ オブジェクト <code>RouteData
を取得します (ASP.NET MVC では、ルート データにはコントローラーとアクションの名前が含まれている必要があります)。次に RouteData code> は <code>IRouteHandler
を取得し、最後に IRouteHandler
を取得して IHttpHandler
を取得します。 🎜IHttpHandler
は、ProcessRequest
メソッドで現在のリクエストを処理します。このメソッド、IControllerFactory
は ControllerBuilder
を通じて取得され、Controller
の型はリフレクションを通じて取得されます。 🎜ControllerBase
は、すべての Controller
のベースです。 > クラス、タイプの Execute
メソッドで、Action
への呼び出しは IActionInvoker
の InvokeAction
メソッドを通じて実行されます。 >。 Action
が実行される前に、🎜model🎜バインディングとモデル認証の操作が実行されます。 🎜在ASP.NET MVC5中有常用的过滤器有5个:IAuthenticationFilter
、IAuthorizationFilter
、IActionFilter
、IResultFilter
、I<a href="//m.sbmmt.com/wiki/265.html" target="_blank">Exception</a>Filter
。
在ASP.NET MVC中所有的过滤器最终都会被封装为Filter
对象,该对象中FilterScope
类型的属性Scope
和int
类型属性<a href="//m.sbmmt.com/wiki/1360.html" target="_blank">Ord</a>er
用于决定过滤器执行的先后顺序,具体规则如下:
Order
和FilterScope
的数值越小,过滤器的执行优先级越高;
Order
比FilterScope
具有更高的优先级,在Order
属性值相同时才会被考虑
//数值越小,执行优先级越高public enum FilterScope { Action= 30, Controller= 20, First= 0, Global= 10, Last= 100}
Action
执行完毕之后会返回ActionResult
类型对象作为对此次请求进行处理的结果,对于不是ActionResult
类型的返回值,ASP.NET MVC会将其转换为ActionResult
类型。
ASP.NET 应用程序的生命周期以浏览器向 Web 服务器发送请求为起点,请求到达服务器后进入处理管道,至浏览器接收服务器响应时为止。
最后附上一张老外绘制的ASP.NET请求管道图,图片来自《ASP.NET MVC Interview Questions and Answers Book》这本书。
以上がASP.NET MVC5 要求処理パイプラインとライフサイクルに関する詳細なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。