請求處理管道
請求管道是一些用於處理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請求的處理且不涉及太多細節。
HttpApplication與HttpModule
HTTP請求由ASP.NET運行時接管之後,HttpRuntime
會利用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()
方法最先執行,一般在該方法中添加一些配置,如路由註冊、全域過濾器的註冊等。
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
IHttpHandler
在ProcessRequest
方法中對當前請求進行處理,在該方法中通過ControllerBuilder
得到IControllerFactory
然後通過反射的方式擷取Controller
的類型。
Action
ASP.NET MVC中ControllerBase
是所有Controller
的基類,在類型的Execute
方法中通過IActionInvoker
的InvokeAction
方法來執行對Action
的調用。在Action
執行前會進行模型繫結和模型認證操作。
Filters
在ASP.NET MVC5中有常用的過濾器有5個:IAuthenticationFilter
、IAuthorizationFilter
、IActionFilter
、IResultFilter
、IExceptionFilter
。
在ASP.NET MVC中所有的過濾器最終都會被封裝為Filter
對象,該對象中FilterScope
類型的屬性Scope
和int
類型屬性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視頻教程