路由实现 ASP.NET MVC 4框架揭秘:URL路由(3)
ASP.NET MVC 4框架揭秘:URL路由(3)
URL路由( )
在Global asax中我们创建了一个基于指定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)
{
context PostResolveRequestCache += OnPostResolveRequestCache;
}
protected virtual void OnPostResolveRequestCache(object sender EventArgs e)
{
HttpContextWrapper Context =
new HttpContextWrapper(HttpContext Current)
RouteData routeData = RouteTable Routes GetRouteData(Context)
if (null == routeData)
{
return;
}
RequestContext requestContext = new RequestContext {
RouteData = routeData HttpContext = Context };
IHttpHandler handler =
routeData RouteHandler GetHttpHandler(requestContext)
Context RemapHandler(handler)

}
}
当PostResolveRequestCache事件触发之后 UrlRoutingModule通过RouteTable的静态只读属性Routes得到表示全局路由表的RouteDictionary对象 然后调用其GetRouteData方法并传入用于封装当前HttpContext的HttpContextWrapper对象(HttpContextWrapper是HttpContextBase的子类)最终得到一个封装路由数据的RouteData对象 如果得到的RouteData不为Null 则根据该对象本身和之前得到的HttpContextWrapper对象创建一个表示当前请求上下文的RequestContext对象 将其作为参数传入RouteData的RouteHandler的GetHttpHandler方法得到一个HttpHandler对象 最后我们调用HttpContextWrapper对象的RemapHandler方法将得到的HttpHandler进行映射使之用于对当前HTTP请求的处理
返回目录ASP NET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化 让你的Java程序更快 更稳定
lishixinzhi/Article/program/net/201311/16110