ASP.NET MVC5請求處理管道和生命週期的詳細教程

來源:互聯網
上載者:User

請求處理管道

請求管道是一些用於處理HTTP請求的模組組合,在ASP.NET中,請求管道有兩個核心組件: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運行時接管之後,HttpRuntime會利用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的調用。在Action執行前會進行模型繫結和模型認證操作。

Filters

在ASP.NET MVC5中有常用的過濾器有5個:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterIExceptionFilter
在ASP.NET MVC中所有的過濾器最終都會被封裝為Filter對象,該對象中FilterScope類型的屬性Scopeint類型屬性Order用於決定過濾器執行的先後順序,具體規則如下:

  • 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視頻教程

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.