.NET Core开发日志——简述路由
有过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开发日志——简述路由相关推荐
- .NET Core开发日志——配置
.NET Core开发日志--配置 原文:.NET Core开发日志--配置 熟悉ASP.NET的开发者一定对web.config文件不陌生.在ASP.NET环境中,要想添加配置参数,一般也都会在此文 ...
- .NET Core开发日志——RequestDelegate
本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...
- .NET Core开发日志——WCF Client
WCF作为.NET Framework3.0就被引入的用于构建面向服务的框架在众多项目中发挥着重大作用.时至今日,虽然已有更新的技术可以替代它,但对于那些既存项目或产品,使用新框架重构的代价未必能找到 ...
- .NET Core开发日志——HttpClientFactory
当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类.该类包含了众多有用的方法,可以满足绝大多数的需求.但是如果对其使用不当时,可能会出现意想不到的事情. 博客园 ...
- .NET Core开发日志——从ASP.NET Core Module到KestrelServer
ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...
- .NET Core开发日志——Runtime IDentifier
.NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台,所以有时遇上出乎意料的事情也纯属正常情况.这时只需点耐心,多查查资料,努力找到原因,也未尝不是件有意义的体验. 比如当建完一个最简 ...
- mysql odata_.NET Core开发日志之OData(Open Data Protocol)
简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...
- .NET Core开发日志——OData
简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...
- .NET Core开发日志——结构化日志
在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...
最新文章
- Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
- 服务器运行jupyter notebook,解决办法
- jQuery快速复习
- 正确使用和理解C#中的闭包
- java mtom_java-axis1.4客户端使用Mtom发送文件
- OpenGL-坐标系
- windows server 2008安装桌面风格(桌面体验)
- [转载]你呀,最大的问题就是太合群了
- amplify color_如何使用Amplify监视Nginx
- 我来到这世上,却不曾歌唱
- vector容器——容量和大小
- 软件使用-如何卸载360安全客户端
- 人在囧途——Java程序猿学习Python
- 沁恒微电子CH347是一款高速USB总线转接芯片
- Linux安装配置Tomcat 8.5.34 快捷启动,关闭(二)
- Derek Sivers:砍掉一切没有惊讶感的内容(译)
- 右键文件夹一直转圈圈怎么办
- Edge、Chrome 1月12日之后继续使用Flash的方法(超级专业,高能预警)
- NOI OJ 1.3 11:计算浮点数相除的余数 C语言
- app消息推送服务器端,系统服务:APP消息推送服务