ASP.NET MVC5請求管道和生命週期

請求處理管道

請求管道是一些用於處理HTTP請求的模塊組合,在ASP.NET中,請求管道有兩個核心組件:IHttpModuleIHttpHandler。全部的HTTP請求都會進入IHttpHandler,有IHttpHandler進行最終的處理,而IHttpModule經過訂閱HttpApplication對象中的事件,能夠在IHttpHandler對HTTP請求進行處理以前對請求進行預處理或IHttpHandler對HTTP請求處理以後進行再次處理。html

在IIS7以前,如IIS6或IIS5,請求處理管道分爲兩個:IIS請求處理管道和ASP.NET管道,若客戶端請求靜態資源則只有IIS管道進行處理,而ASP.NET管道不會處理該請求。從IIS7開始兩個管道合二爲一,稱爲集成管道。web

 

上圖中主要描述ASP.NET運行時對HTTP請求的處理且不涉及太多細節。

HttpApplication與HttpModule

HTTP請求由ASP.NET運行時接管以後,HttpRuntime會利用HttpApplicationFactory建立或從HttpApplication對象池(.NET中相似的機制有線程池和字符串拘留池)中取出一個HttpApplication對象,同時ASP.NET會根據配置文件來初始化註冊的HttpModuleHttpModule在初始化時會訂閱HttpApplication中的事件來實現對HTTP請求的處理。windows

在ASP.NET MVC5中,Global.asax文件中定義了MvcApplication類,繼承自HttpApplication類:api

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進行處理。mvc

Controller

IHttpHandlerProcessRequest方法中對當前請求進行處理,在該方法中經過ControllerBuilder獲得IControllerFactory而後經過反射的方式獲取Controller的類型。app

Action

ASP.NET MVC中ControllerBase是全部Controller的基類,在該類型的Execute方法中經過IActionInvokerInvokeAction方法來執行對Action的調用。在Action執行前會進行模型綁定和模型認證操做。框架

Filters

在ASP.NET MVC5中有經常使用的過濾器有5個:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterIExceptionFilter
在ASP.NET MVC中全部的過濾器最終都會被封裝爲Filter對象,該對象中FilterScope類型的屬性Scopeint類型屬性Order用於決定過濾器執行的前後順序,具體規則以下:asp.net

  • OrderFilterScope的數值越小,過濾器的執行優先級越高;
  • OrderFilterScope具備更高的優先級,在Order屬性值相同時FilterScope纔會被考慮
//數值越小,執行優先級越高
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》這本書。


 

書目推薦

ASP.NET MVC 5 APPLICATION LIFECYCLE – HIGH-LEVEL VIEW(強烈推薦)
ASP.NET WEB API 2: HTTP MESSAGE LIFECYLE(牆裂推薦)

《ASP.NET MVC Interview Questions and Answers Book》
《ASP.NET MVC5框架揭祕》

參考文章

IIS 7.0 的 ASP.NET 應用程序生命週期概述
The IIS7 Integrated Pipeline

版權聲明

本文爲做者原創,版權歸做者雪飛鴻全部。 轉載必須保留文章的完整性,且在頁面明顯位置處標明原文連接

若有問題, 請發送郵件和做者聯繫。

相關文章
相關標籤/搜索