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

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

然后是MVC应用程序:

再到了ASP.NET Core:

还可以用更简单的写法:

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

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

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

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

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

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

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

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

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

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

先执行AttributeRoute里的RouteAsync方法:

里面调用了TreeRouter的RouteAsync方法:

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

该方法内部的处理仅是为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。

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

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

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

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

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

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

  • 添加路由

  • 匹配地址

  • 处理请求

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


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

.NET Core开发日志——简述路由相关推荐

  1. .NET Core开发日志——配置

    .NET Core开发日志--配置 原文:.NET Core开发日志--配置 熟悉ASP.NET的开发者一定对web.config文件不陌生.在ASP.NET环境中,要想添加配置参数,一般也都会在此文 ...

  2. .NET Core开发日志——RequestDelegate

    本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...

  3. .NET Core开发日志——WCF Client

    WCF作为.NET Framework3.0就被引入的用于构建面向服务的框架在众多项目中发挥着重大作用.时至今日,虽然已有更新的技术可以替代它,但对于那些既存项目或产品,使用新框架重构的代价未必能找到 ...

  4. .NET Core开发日志——HttpClientFactory

    当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类.该类包含了众多有用的方法,可以满足绝大多数的需求.但是如果对其使用不当时,可能会出现意想不到的事情. 博客园 ...

  5. .NET Core开发日志——从ASP.NET Core Module到KestrelServer

    ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...

  6. .NET Core开发日志——Runtime IDentifier

    .NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台,所以有时遇上出乎意料的事情也纯属正常情况.这时只需点耐心,多查查资料,努力找到原因,也未尝不是件有意义的体验. 比如当建完一个最简 ...

  7. mysql odata_.NET Core开发日志之OData(Open Data Protocol)

    简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...

  8. .NET Core开发日志——OData

    简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...

  9. .NET Core开发日志——结构化日志

    在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...

最新文章

  1. Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
  2. 服务器运行jupyter notebook,解决办法
  3. jQuery快速复习
  4. 正确使用和理解C#中的闭包
  5. java mtom_java-axis1.4客户端使用Mtom发送文件
  6. OpenGL-坐标系
  7. windows server 2008安装桌面风格(桌面体验)
  8. [转载]你呀,最大的问题就是太合群了
  9. amplify color_如何使用Amplify监视Nginx
  10. 我来到这世上,却不曾歌唱
  11. vector容器——容量和大小
  12. 软件使用-如何卸载360安全客户端
  13. 人在囧途——Java程序猿学习Python
  14. 沁恒微电子CH347是一款高速USB总线转接芯片
  15. Linux安装配置Tomcat 8.5.34 快捷启动,关闭(二)
  16. Derek Sivers:砍掉一切没有惊讶感的内容(译)
  17. 右键文件夹一直转圈圈怎么办
  18. Edge、Chrome 1月12日之后继续使用Flash的方法(超级专业,高能预警)
  19. NOI OJ 1.3 11:计算浮点数相除的余数 C语言
  20. app消息推送服务器端,系统服务:APP消息推送服务

热门文章

  1. 程序人生:织梦dedecms后台/会员验证码关闭
  2. 阿里云三维可视化使用初体验
  3. Centos 磁盘管理及配额管理
  4. Java并发编程-原子性变量
  5. 运维前线:一线运维专家的运维方法、技巧与实践导读
  6. CSS:CSS 在工程中改变——面向对象的CSS (OO CSS)
  7. 使用表达式自定义Serilog输出格式
  8. WPF 分页控件的简单实现
  9. 如何在 ASP.Net Core 中使用 File Providers
  10. HttpClientFactory 结合 Polly 轻松实现重试机制