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

PHPz
發布: 2017-04-23 16:29:05
原創
2794 人瀏覽過

請求處理管道

請求管道是一些用於處理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執行時間接管之後,HttpRun<a href="http://www.php.cn/wiki/1268.html" target="_blank">time</a>#會利用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處理。

ControllerIHttpHandlerProcessRequest方法中對目前請求進行處理,在該方法中透過

ControllerBuilder

得到IControllerFactory然後透過反射的方式取得Controller的類型。

ActionASP.NET MVC中ControllerBase是所有Controller的基底類,在類型的Execute方法中透過IActionInvokerInvokeAction方法來執行對

Action###的呼叫。在###Action###執行前會進行###模型###綁定和模型認證作業。 ###

Filters

在ASP.NET MVC5中有常用的过滤器有5个:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterI<a href="http://www.php.cn/wiki/265.html" target="_blank">Exception</a>Filter
在ASP.NET MVC中所有的过滤器最终都会被封装为Filter对象,该对象中FilterScope类型的属性Scopeint类型属性<a href="http://www.php.cn/wiki/1360.html" target="_blank">Ord</a>er用于决定过滤器执行的先后顺序,具体规则如下:

  • 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视频教程

以上是ASP.NET MVC5請求處理管道和生命週期的詳細教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!