.NET Core开发日志——简述路由

有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由,可以这样形容:通过对URL的解析,指定相应的处理程序。

回忆下在Web Forms应用程序中使用路由的方式:

640?wx_fmt=png

然后是MVC应用程序:

640?wx_fmt=png

再到了ASP.NET Core:

640?wx_fmt=png

还可以用更简单的写法:

640?wx_fmt=png

从源码上看这两个方法的实现是一样的。

640?wx_fmt=png

关键是内部UseMvc方法的内容:

640?wx_fmt=png

其中的处理过程,首先实例化了一个RouteBuilder对象,并对它的DefaultHandler属性赋值为MvcRouteHandler。接着以其为参数,执行routes.MapRoute方法。

MapRoute的处理过程就是为RouteBuilder里的Routes集合新增一个Route对象。

640?wx_fmt=png

有此一个Route对象仍不夠,程序里又插入了一个AttributeRoute。

随后执行routes.Build(),返回RouteCollection集合。该集合实现了IRouter接口。

640?wx_fmt=png

最终使用已完成配置的路由。

640?wx_fmt=png

于是又看到了熟悉的Middleware。它的核心方法里先调用了RouteCollection的RouteAsync处理。

640?wx_fmt=png640?wx_fmt=png

其内部又依次执行各个Route的RouteAsync方法。

640?wx_fmt=png

之前的逻辑中分别在RouteCollection里加入了AttributeRoute与Route。
*循环中会判断Handler是否被赋值,这是为了避免在路由已被匹配的情况下,继续进行其它的匹配。从执行顺序来看,很容易明白AttributeRoute比一般Route优先级高的道理。

先执行AttributeRoute里的RouteAsync方法:

640?wx_fmt=png

里面调用了TreeRouter的RouteAsync方法:

640?wx_fmt=png

如果所有AttributeRoute路由都不能匹配,则不会进一步作处理。否则的话,将继续执行Handler中的RouteAsync方法。这里的Handler是MvcAttributeRouteHandler。

640?wx_fmt=png

该方法内部的处理仅是为RouteContext的Handler属性赋值。实际的操作则是要到RouterMiddleware中Invoke方法的context.Handler(context.HttpContext)这一步才被执行的。

至于Route里的RouteAsync方法:

只有路由被匹配的时候才在OnRouteMatched里调用target的RouteAsync方法。

protected override Task OnRouteMatched(RouteContext context){
    context.RouteData.Routers.Add(_target);    return _target.RouteAsync(context);
}

此处的target即是最初创建RouteBuilder时传入的MvcRouteHandler。

640?wx_fmt=png

只有路由被匹配的时候才在OnRouteMatched里调用target的RouteAsync方法。

protected override Task OnRouteMatched(RouteContext context){
    context.RouteData.Routers.Add(_target);    return _target.RouteAsync(context);
}

此处的target即是最初创建RouteBuilder时传入的MvcRouteHandler。

640?wx_fmt=png

处理过程与MvcAttributeRouteHandler相似,一样是要在RouterMiddleware的Invoke里才执行Handler的方法。

以一张思维导图可以简单概括上述的过程。

640?wx_fmt=png

或者用三句话也可以描述整个流程。

  • 添加路由

  • 匹配地址

  • 处理请求

原文地址:https://www.cnblogs.com/kenwoo/p/9484499.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值