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++音频/视频技术开发与实战