MVC中的擴展點(一)路由系統簡介

   之所以說MVC框架很靈活,在於其擴展性很強,幾乎在請求處理管道的任何一個節點都可以擴展。本系列文章將會對擴展點進行總結整理,以此增強對MVC框架的瞭解。

    MVC是建立在路由系統之上的,所以嚴格上講,路由系統並不屬於MVC框架,路由系統是.NET Framework 3.5 SP1新增的內容,位於System.Web.Routing命名空間。

    下面爲ASP.NET MVC請求處理管道示意圖(注:來源於Steven Sanderson所著《Pro ASP.NET MVC Framework》一書):

mvc

    當IIS接收到一個請求後,將按以下步驟進行處理:

1、IIS根據文件類型將請求轉交給相應的處理程序,如果屬於ASP.NET文件,則將請求轉發給aspnet_isapi.dll。(注:在II6和IIS7上的處理方式是有區別的)

2、 HTTP處理模塊UrlRoutingModule接收到請求後,循環調用其RouteCollection集合中的RouteBase對象,找出匹配的RouteBase。

3、根據匹配的RouteBase對象返回的RoueData對象,獲取RouteHandler。

4、RouteHandler返回一個HTTP處理程序(IHttpHandler),最終通過此處理程序處理請求,生成應答內容。

5.、如果RouteHandler爲MvcRouteHandler,並且其返回的HTTP處理程序爲MvcHandler,則進入到MVC框架,MvcHandler對象負責調用適當的控制器和活動方法,生成應答內容。

    從上面步驟中可以看出,只有到第五個步驟後才真正進入到MVC框架,在此之前都是在ASP.NET的路由系統中。下面介紹這些步驟中涉及到的類型:

1、UrlRoutingModule類

    此類事路由系統的核心類,其主要功能是根據請求上下文找出合適的RouteBase對象。屬性RouteCollection是一個RouteBase對象集合,UrlRoutingModule接收到請求後,循環RouteCollection集合中的RouteBase對象,調用其GetRouteData方法,如果該方法返回的RouteData對象不爲null,則終止循環,將RouteData對象存入RequestContext。然後根據RouteData的RouteHandler獲取合適的IHttpHandler處理程序。

    UrlRoutingModule實際上是一個ASP.NET的HTTP 處理模塊,所以它通過配置文件的<httpMoudles>配置節點來添加的。

2、RouteTable類

    用於存儲應用程序的路由集合,靜態屬性Routes返回應用程序的路由集合,它實際等同於UrlRoutingModule的RouteCollection屬性。通過RouteTable.Routes.Add方法可以添加自定義的RouteBase對象。

3、RouteBase類

    表示一個ASP.NET路由的基類,所有的路由都應該繼承自此類。

    GetRouteData方法檢查傳入的HttpContextBase信息是否符合路由規則,符合則返回一個RouteData對象,不符合則返回null,此方法由UrlRoutingModule類在循環RouteTable.Routes集合時調用。

    GetVirtualPath方法根據路由數據生成相應的Url。

4、Route類

    是RouteBase的一個實現,主要添加了幾個屬性:

    Constraints: 對URL的約束條件

    DataTokens:傳遞到路由處理程序的自定義值

    Defaults:Url不包含指定參數時得默認值

    RouteHandler:一個路由處理程序(IRouteHandler)

5、IRouteHandler接口

    路由處理程序接口,包含一個GetHttpHandler方法,用於返回一個IHttpHandler處理程序對象。

6、MvcRouteHandler類

    Mvc框架實現的一個路由處理程序,其GetHttpHandler方法返回一個MvcHandler對象

7、MvcHandler

    由MvcRouteHandler返回,根據請求信息,調用合適的控制器和方法,生成應答內容。

8、StopRoutingHandler類

    表示一個“不處理URL的路由處理類”疑惑  比如MVC在RouteCollection類型上擴展了一個IgnoreRoute方法,用於指示路由系統忽略處理指定的url。其實現方式是生成一個Route對象,指定其RouteHandler屬性爲一個StopRoutingHandler對象。

9、IRouteConstraint接口

    用於構建Route.Constraints屬性,表示一個約束條件。Match方法用於檢查url是否符合路由規則,符合返回true,否則false。

 

嚯嚯,看來路由擴展點要留到下一篇去講了。   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章