Controller的激活與URL路由
ASPNET路由系統是HTTP請求抵達服務端的第一道屏障它根據注冊的路由規則對攔截的請求進行匹配並解析包含目標Controller和Action名稱的路由信息而當前ControllerBuilder具有用於激活Controller對象的ControllerFactory現在看看兩者是如何結合起來的
通過第章URL路由的介紹我們知道ASPNET路由系統的核心是一個叫做UrlRoutingModule的HttpModule路由的實現是它通過注冊代表HttpApplication的PostResolveRequestCache事件對HttpHandler的動態映射來實現的具體來說它通過以RouteTable的靜態屬性Routes代表的全局路由表對請求進行匹配並得到一個RouteData對象RouteData具有一個實現了接口IRouteHandler的屬性RouteHandler通過該屬性的GetHttpHandler方法可以得到最終被映射到當前請求的HttpHandler對象
對於ASPNET MVC應用來說RouteData的RouteHandler屬性類型為MvcRouteHandler實現在MvcRouteHandler中的HttpHandler提供機制基本上(不是完全等同)可以通過如下的代碼來體現MvcRouteHandler維護著一個ControllerFactory對象該對象可以在構造函數中指定如果沒有顯示指定則直接通過調用當前ControllerBuilder的GetControllerFactory方法獲取
public class MvcRouteHandler : IRouteHandler
{
private IControllerFactory _controllerFactory;
public MvcRouteHandler() this(ControllerBuilderCurrent
GetControllerFactory())
{ }
public MvcRouteHandler(IControllerFactory controllerFactory)
{
_controllerFactory = controllerFactory;
}
IHttpHandler IRouteHandlerGetHttpHandler(RequestContext requestContext)
{
string controllerName = (string)requestContextRouteData
GetRequiredString(controller)
SessionStateBehavior sessionStateBehavior = _controllerFactory
GetControllerSessionBehavior(requestContext controllerName)
requestContextHttpContextSetSessionStateBehavior(sessionStateBehavior)
return new MvcHandler(requestContext)
}
}
在用於提供HttpHandler的GetHttpHandler方法中除了返回一個實現了IHttpHandler接口的MvcHandler對象之外還需要對當前HTTP上下文的會話狀態行為模式進行設置具體的實現是先通過包含在RequestContext的RouteData對象得到Controller的名稱該名稱連同RequestContext對象一起傳入ControllerFactory的GetControllerSessionBehavior方法得到一個類型為SessionStateBehavior的枚舉最後通過RequestContext得到當前HTTP上下文(實際上是一個HttpContextWrapper對象)並調用其SetSessionStateBehavior方法對會話狀態行為進行設置
通過第章URL路由的介紹我們知道RouteData中的RouteHandler屬性最初來源於對應的路由對象而當我們調用RouteCollection的擴展方法MapRoute方法時注冊的Route對象對應的RouteHandler是一個MvcRouteHandler對象由於在創建MvcRouteHandler對象時並沒有顯式指定ControllerFactory所以通過當前ControllerBuilder的GetControllerFactory方法得到的ControllerFactory默認被使用
通過當前ControllerBuilder的GetControllerFactory方法得到的ControllerFactory僅僅用於獲取會話狀態行為模式而MvcHandler真正將它用於創建Controller如下的代碼片段基本上體現了MvcHandler的定義它對請求處理的邏輯定義在BeginProcessRequest方法中
[] []
From:http://tw.wingwit.com/Article/program/net/201311/16088.html