前言

我是从.net 4.5直接跳到.net core 3.x的,感觉asp.net这套东西最初是从4.5中的owin形成的。
目前官方文档重点是讲路由,没有特别说明与传统路由的区别,本篇主要介绍终结点路由的相关概念和如何使用,不会详细介绍路由,这个参考官方文档就ok了。如果将来有机会研究到底层再深度剖析。

参考:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/routing?view=aspnetcore-3.1
https://q.cnblogs.com/q/113644/ 
https://aregcode.com/blog/2019/dotnetcore-understanding-aspnet-endpoint-routing/

概述

最初我们访问 http://www.abc.com/a.aspx时,服务端是存在a.aspx这个文件的,服务端根据此文件帮我们创建一个对应类的实例处理请求。
后来需求越来越复杂,出现了路由,目的是将请求地址与执行请求的处理器的直接关联,变成映射关联,映射规则由我们自己配置。
在asp.net core 3.x之前这个路由系统是包含在mvc内部的,.net framework时代有个特殊的HttpModule来实现mvc,路由系统也包含其中。.net core是由有个特殊的中间件来实现mvc的,路由系统就包含在这个中间件中。
这种方式有个问题,mvc只是一个中间件,路由系统包含在其中,如果我们希望在mvc中间件之后加入其它中间件,其它中间件是无法(也许是不方便)访问路由相关信息的。
另外asp.net core并不是只有mvc,还有webapi、blazor、signlR、接入gRpc等,将来还有更多,我们的路由系统能否提出来,让所有框架都可以用?

因此出现了终结点路由,我们说路由的根本目的是将用户请求地址,映射为一个请求处理器,最简单的请求处理器可以是一个委托 Func<HttpCotnext,Task>,也可以是mvc/webapi中某个controller的某个action,所以从抽象的角度讲 一个终结点 就是一个处理请求的委托。由于mvc中action上还有很多attribute,因此我们的终结点还应该提供一个集合,用来存储与此请求处理委托的关联数据。
从抽象的角度可以简单理解为   一个终结点 = 处理请求的委托 + 与之关联的附加(元)数据。对应到mvc来理解的话 终结点 = action + 应用其上的attribute集合。但记住终结点是个抽象的概念,并不只服务于mvc,原理大概如下:

  1. 在程序启动前我们应该定义好程序中有哪些终结点,当然不是我们手动一个个定义,而是根据目标框架自动生成,针对mvc来说的话可以自动将程序中与路由匹配的action转换成对应的终结点,其它框架应该也有对应的方式,反正最终我们所有用来处理请求的东东都变成了终结点。这步是在定义路由时自动完成的

  2. 除了定义终结点我们还要定义 请求路径 与 终结点的对应关系,将来请求抵达时才能匹配找到合适的终结点来处理我们的请求,这步相当于定义路由

  3. 我们还需要定义一个解析器,当请求抵达时根据终结点与路径的对应关系找到终结点,微软已定义好对应的中间件来表示这个解析器。

  4. 最后我们需要定义一个中间件,在上面的中间件执行后 我们可以拿到与当前请求匹配的终结点,最终调用它的委托处理请求,这个中间件就是mvc中间件

  5. 到此asp.net core 3.x的中间件路由默认差不多就这样了,此时我们可以定义自己的中间件,放在步骤3后面,拿到终结点做一些高级处理。微软定义的一些中间件也是这个套路

如何使用

在通过vs默认模板创建asp.net core 3.x项目时,在startup中会看到这样的代码

注册路由

看代码的第2行。它有如下3个任务

  1. 创建终结点定义,针对mvc来说会自动将程序中与路由格式匹配上的action转换为终结点。在第5行之后可以调试观察endpoints.DataSource属性,生成好的终结点就在里面

  2. 建立url与终结点的对应关系,这种关系存在哪?我也不晓得

  3. 注册mvc中间件(它在将来请求抵达,且之前有中间件解析得到与当前请求匹配的终结点后,开始mvc旅程)

这里路由跟以前的写法差不多,上面默认值啊、约束啊就去看官方文档吧。
创建终结点也会参照属性路由,微软推荐webapi使用属性路由,mvc使用传统路由。你会看到创建默认webapi项目时这样的 endpoints.MapControllers();

终结点进一步定制

默认情况下是根据定义的路由去找到匹配的action最后生成终结点,这个生成终结点的过程我们是可以参与的,具体办法是通过endpoints.MapControllerRoute的返回对象上调用相关扩展方法,本质上是向终结点的创建过程加入一些委托,将来创建终结点时,这些委托将被调用,代码如下:

动态路由

app.UseEndpointsmvc时就说明了使用mvc和webapi了,默认情况下一个action会创建一个对应的终结点,请求抵达时匹配到终结点就直接执行了。但有时候我们希望自己控制一个请求过来时使用哪个controller的哪个action,具体做法:
定义一个类,继承DynamicRouteValueTransformer,并注册到ioc容器中,最后调用一个扩展方法,看代码:

这样将来请求抵达时,解析得到终结点时会调用我们的MyRouteValueTransformer,我们可以获取已解析得到的路有数据,然后选择替换/增加某些路由数据,从而达到定制化

回退路由

默认情况下请求抵达时,若没有找到匹配的终结点,就直接404了,我们希望当没有匹配到任何终结点时直接执行某个默认的终结点,可以用如下方式:

endpoints.MapFallbackToController("{controller}/{action}/{id?}", "kkk", "jj");

当请求抵达时,如果没有匹配到任何终结点,则默认执行jjController.kkk方法。可以想象得到此功能可能是通过动态路由实现的

还有几个相关的扩展方法,有了上面的讲解,估计你也能猜出是干嘛用的了。关于路由注册就暂时说这么多

自定义中间件提前拿到终结点数据

app.UseRouting();对应概述中的步骤3,此扩展方法内部会注册一个中间件,将来请求抵达时它会帮我们找到与当前请求匹配的终结点并存储在HttpContext中,且匹配过程中解析得到的路由数据在Request.RouteValues中。我们可以在它后面加入自己的中间件

asp.net core 3.x Endpoint终结点路由1-基本介绍和使用相关推荐

  1. ASP.NET Core 3.x - Endpoint Routing 路由体系的内部机制

    Endpoint是什么? Endpoint简单的可以理解为这样的一些类,它们包含一个请求的委托(Request Delegate)和其它的一些元数据,使用这些东西,Endpoint类可以生成一个响应. ...

  2. Asp.Net Core EndPoint 终结点路由工作原理解读

    Asp.Net Core EndPoint 终点路由工作原理解读 一.背景 在本打算写一篇关于Identityserver4 的文章时候,却发现自己对EndPoint -终结点路由还不是很了解,故暂时 ...

  3. 处理ASP.NET Core中的HTML5客户端路由回退

    在使用由Angular,React,Vue等应用程序框架构建的客户端应用程序时,您总是会处理HTML5客户端路由,它将完全在浏览器中处理到页面和组件的客户端路由.几乎完全在浏览器中... HTML5客 ...

  4. ASP.NET Core使用功能开关控制路由访问

    前言 在前面的文章,我们介绍了使用Middleware有条件地允许访问路由(<ASP.NET Core使用Middleware有条件地允许访问路由>). 而对于一些试验性的功能,我们并不希 ...

  5. ASP.NET Core MVC/WebAPi如何构建路由?

    前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...

  6. asp.net core 系列 6 MVC框架路由(下)

    一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接. 生成 URL 可消除硬编码 URL,使代码更稳定.更易维护. 此部分重点介绍 ...

  7. ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记

    点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 1.介绍与引入 2.配置管理 3.依赖注入 ...

  8. Asp.NET Core 轻松学-项目目录和文件作用介绍

    前言     上一章介绍了 Asp.Net Core 的前世今生,并创建了一个控制台项目编译并运行成功,本章的内容介绍 .NETCore 的各种常用命令.Asp.Net Core MVC 项目文件目录 ...

  9. ASP.NET Core 基础(九)——路由Routing

    此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/ ...

最新文章

  1. oracle9i的全局变量,Oracle9i, 10g 如何抓取绑定变量的值
  2. winform 让他间隔一段时间 执行事件 且只执行一次_Redis 事件机制详解
  3. 【面试被虐】如何只用2GB内存从20亿,40亿,80亿个整数中找到出现次数最多的数?...
  4. Linux之虚拟机里的REHL7的IP
  5. 软件开发必修课:你该知道的GRASP职责分配模式
  6. pano2vr怎么制作漫游_春节7天长假,在云南怎么玩?
  7. Spring Boot filter
  8. 纪中C组模拟赛总结(2019.7.9)
  9. sql server 备份计划
  10. JQuery版评分控件
  11. [ios开发]锁屏后的相机的方向检查,与图片的自动旋转
  12. iOS语言中的代理模式
  13. 控制器布局 php,PhalconPHP视图/布局/控制器
  14. visio2016无法卸载和安装
  15. CTF web题常用解题工具
  16. SAR笔记-卫星轨道建模
  17. Java 截取字符串
  18. Integration using Feynman technique
  19. 串口设备短信模块开发笔记
  20. input框禁止输入的四种方式

热门文章

  1. mysql table alter_MySQL-ALTER TABLE命令学习[20180503]
  2. 惠普m1005连接电脑步骤_电脑连接电视机详细步骤方法图文
  3. Teams Bot如何判断用户所在的时区
  4. 为您的Blogger博客设计一个美丽的新主题
  5. 如何删除Apple Music中的连接功能
  6. 如何使用APTonCD备份和还原已安装的Ubuntu软件包
  7. 免费的数字图书馆_不仅是书籍:您当地图书馆可能提供的所有免费数字资料
  8. 2019第10周知识总结
  9. 基于 HTML5 Canvas 绘制的电信网络拓扑图
  10. 为什么PostgreSQL比MongoDB还快之完结篇(深挖单点索引查询)