URL路由()
在Globalasax中我們創建了一個基於指定URL模板({controller}/{action})的Route對象並將其添加到通過RouteTable的靜態只讀屬性Routes所表示的全局路由表中
UrlRoutingModule
路由表的作用是對當前的HTTP請求的URL進行解析從而獲取一個以Controller和Action名稱為核心的路由數據即上面介紹的RouteData對象整個解析工作是通過一個類型為UrlRoutingModule的自定義HttpModule來完成的如下面的代碼片段所示在實現了接口IHttpModule的UrlRoutingModule類型的Init方法中我們注冊了HttpApplicataion的PostResolveRequestCache事件
public class UrlRoutingModule: IHttpModule
{
public void Dispose()
{}
public void Init(HttpApplication context)
{
contextPostResolveRequestCache += OnPostResolveRequestCache;
}
protected virtual void OnPostResolveRequestCache(object sender EventArgs e)
{
HttpContextWrapper httpContext =
new HttpContextWrapper(HttpContextCurrent)
RouteData routeData = RouteTableRoutesGetRouteData(httpContext)
if (null == routeData)
{
return;
}
RequestContext requestContext = new RequestContext {
RouteData = routeData HttpContext = httpContext };
IHttpHandler handler =
routeDataRouteHandlerGetHttpHandler(requestContext)
httpContextRemapHandler(handler)
}
}
當PostResolveRequestCache事件觸發之後UrlRoutingModule通過RouteTable的靜態只讀屬性Routes得到表示全局路由表的RouteDictionary對象然後調用其GetRouteData方法並傳入用於封裝當前HttpContext的HttpContextWrapper對象(HttpContextWrapper是HttpContextBase的子類)最終得到一個封裝路由數據的RouteData對象如果得到的RouteData不為Null則根據該對象本身和之前得到的HttpContextWrapper對象創建一個表示當前請求上下文的RequestContext對象將其作為參數傳入RouteData的RouteHandler的GetHttpHandler方法得到一個HttpHandler對象最後我們調用HttpContextWrapper對象的RemapHandler方法將得到的HttpHandler進行映射使之用於對當前HTTP請求的處理
返回目錄ASPNET MVC 框架揭秘
編輯推薦
ASP NET開發培訓視頻教程
Microsoft NET框架程序設計視頻教程
Java程序性能優化讓你的Java程序更快更穩定
Visual C++音頻/視頻技術開發與實戰
From:http://tw.wingwit.com/Article/program/net/201311/16110.html