請求管道是一些用於處理HTTP請求的模組組合,在ASP.NET中,請求管道有兩個核心元件: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
取得
Controller
IHttpHandler
在ProcessRequest
方法中對目前請求進行處理,在該方法中透過
Action
ASP.NET MVC中
ControllerBase
是所有Controller
的基底類,在類型的Execute
方法中透過IActionInvoker
的InvokeAction方法來執行對
在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中文網其他相關文章!