ASP.net路由原理小结

主题概要
Asp.net路由Asp.net路由原理初探
编辑时间
新建20170714
序号参考资料
1http://wangqingpei557.blog.51cto.com/1009349/1312422/
2https://github.com/aspnet/Routing(路由源码)

路由配置

才接触asp.net,希望能一个专题一个专题的把问题搞明白深入些。

从最简单的RouteConfig开始,RegisterRoutes静态方法进行路由注册:
这里写图片描述
MapPageRoute方法是为了使Url地址与WebForm页面物理地址隔离,MapRoute方法是MVC固定的格式。
配置好后,在Global.asax中进行注册:
这里写图片描述
注意这里的参数,RouteTable.Routes属性是一个RouteCollection。
这里写图片描述
而注意这里的形参routes实际传入的是RouteTable.Routes:
这里写图片描述
所以不管是WebForms的路由,还是MVC的路由,都是存放在RouteTable.Routes。

把路由信息存放到RouteTable.Routes里了,但是在什么地方处理取用它呢?

UrlRoutingModule—路由对象模型的入口

这里面的关键步骤是:
UrlRoutingModule绑定Application事件:

protected virtual void Init(HttpApplication application)
{
    application.PostResolveRequestCache += PostResolveRequestCache;
}

PostResolveRequestCache事件是“ASP.NET 将绕过当前事件处理程序的执行,并允许缓存模块以处理从缓存请求时发生”。更直白的理解就是缓存模块处理从缓存请求时,发生此事件。
在PostResolverRequestCache方法中,该方法调用了本地内部的一个同名方法:

void PostResolveRequestCache(object o, EventArgs e)
{
    var app = (HttpApplication)o;
    PostResolveRequestCache(new HttpContextWrapper(app.Context));
}

然后实例化了一个HttpContextWrapper包装对象,传入该同名方法:

public virtual void PostResolveRequestCache(HttpContextBase context)
{
    var rd = RouteCollection.GetRouteData(context);
    //(1)匹配RouteData对象,后面分析;
    var rc = new RequestContext(context, rd);
    //(2)封装计算出来的RouteData对象和当前HttpRequest对象;
    IHttpHandler http = rd.RouteHandler.GetHttpHandler(rc);
    //(3)使用(1)步骤计算出来的当前RouteData对象中的RouteHander属性获取路由处理程序IHttpHander接口;
    context.Request.RequestContext = rc;
    context.RemapHandler(http);
}

这里面主要分为三个步骤:
1)、根据请求,从前面注册的路由表中,匹配到RouteData对象;
2)、根据RouteData和HttpContext封装一个RequestContext;
3)、根据RouteData的RouteHandler属性获取处理程序IHttpHander接口;
这里要注意的是RouteHandler属性,实际上是一个IRouteHandler接口,根据依赖倒置原则,如果匹配的是MVC路由,就是MVCRouteHandler,如果匹配的是Webform就是Webform的RouteHandler,也可以自定义RouteHandler。
这里写图片描述
这里迷惑的可能是IRouteHandler 、IHttpHandler两个接口之间的关系,IRouteHandler只有一个方法:
这里写图片描述
只有实现了这个方法,才能得到正确的HttpHandler。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值