溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC5請求處理管道和生命周期的示例分析

發(fā)布時間:2021-09-13 17:23:22 來源:億速云 閱讀:173 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“ASP.NET MVC5請求處理管道和生命周期的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“ASP.NET MVC5請求處理管道和生命周期的示例分析”這篇文章吧。

請求處理管道

請求管道是一些用于處理HTTP請求的模塊組合,在ASP.NET中,請求管道有兩個核心組件:IHttpModuleIHttpHandler。所有的HTTP請求都會進入IHttpHandler,有IHttpHandler進行最終的處理,而IHttpModule通過訂閱HttpApplication對象中的事件,可以在IHttpHandler對HTTP請求進行處理之前對請求進行預(yù)處理或IHttpHandler對HTTP請求處理之后進行再次處理。

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

ASP.NET MVC5請求處理管道和生命周期的示例分析

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

HttpApplication與HttpModule

HTTP請求由ASP.NET運行時接管之后,HttpRuntime會利用HttpApplicationFactory創(chuàng)建或從HttpApplication對象池(.NET中類似的機制有線程池和字符串拘留池)中取出一個HttpApplication對象,同時ASP.NET會根據(jù)配置文件來初始化注冊的HttpModuleHttpModule在初始化時會訂閱HttpApplication中的事件來實現(xiàn)對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()方法最先執(zhí)行,一般在該方法中添加一些配置,如路由注冊、全局過濾器的注冊等。

Route

一個HTTP請求會經(jīng)過至少一個HttpModule的處理。UrlRoutingModule是非常重要的模塊,它是路由系統(tǒng)的核心。路由系統(tǒng)的職責(zé)是從請求URL中獲取controller和action的名稱以及其它請求數(shù)據(jù)。
UrlRoutingModule根據(jù)當(dāng)前請求的URL和RouteTable中已注冊的路由模板進行匹配并返回第一個和當(dāng)前請求相匹配的路有對象Route,然后根據(jù)路有對象獲取路由數(shù)據(jù)對象RouteData(ASP.NET MVC中,路由數(shù)據(jù)必須包含controller和action的名稱),再有RouteData獲取IRouteHandler最終有IRouteHandler得到IHttpHandler。

HttpHandler

一個HTTP請求最終要進入HttpHanler中進行處理,一次HTTP請求只能被一個HttpHandler進行處理。

Controller

IHttpHandlerProcessRequest方法中對當(dāng)前請求進行處理,在該方法中通過ControllerBuilder得到IControllerFactory然后通過反射的方式獲取Controller的類型。

Action

ASP.NET MVC中ControllerBase是所有Controller的基類,在類型的Execute方法中通過IActionInvokerInvokeAction方法來執(zhí)行對Action的調(diào)用。在Action執(zhí)行前會進行模型綁定和模型認(rèn)證操作。

Filters

在ASP.NET MVC5中有常用的過濾器有5個:IAuthenticationFilterIAuthorizationFilter、IActionFilter、IResultFilterIExceptionFilter。
在ASP.NET MVC中所有的過濾器最終都會被封裝為Filter對象,該對象中FilterScope類型的屬性Scopeint類型屬性Order用于決定過濾器執(zhí)行的先后順序,具體規(guī)則如下:

  • OrderFilterScope的數(shù)值越小,過濾器的執(zhí)行優(yōu)先級越高;

  • OrderFilterScope具有更高的優(yōu)先級,在Order屬性值相同時才會被考慮

//數(shù)值越小,執(zhí)行優(yōu)先級越高public enum FilterScope
{
    Action= 30,
    Controller= 20,
    First= 0,
    Global= 10,
    Last= 100}

ActionResult

Action執(zhí)行完畢之后會返回ActionResult類型對象作為對此次請求進行處理的結(jié)果,對于不是ActionResult類型的返回值,ASP.NET MVC會將其轉(zhuǎn)換為ActionResult類型。

請求生命周期

ASP.NET 應(yīng)用程序的生命周期以瀏覽器向 Web 服務(wù)器發(fā)送請求為起點,請求到達(dá)服務(wù)器后進入處理管道,至瀏覽器接收服務(wù)器響應(yīng)時為止。

最后附上一張老外繪制的ASP.NET請求管道圖,圖片來自《ASP.NET MVC Interview Questions and Answers Book》這本書。

ASP.NET MVC5請求處理管道和生命周期的示例分析

以上是“ASP.NET MVC5請求處理管道和生命周期的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI