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

前言

我是从.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中。我们可以在它后面加入自己的中间件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

共享后缀的链表

有一种存储英文单词的方法&#xff0c;是把单词的所有字母串在一个单链表上。为了节省一点空间&#xff0c;如果有两个单词有同样的后缀&#xff0c;就让它们共享这个后缀。下图给出了单词“loading”和“being”的存储形式。本题要求你找出两个链表的公共后缀。 函数接口定义&…

C#反射与特性(一):反射基础

1. 说明1.1 关于反射、特性在 《C# 7.0 本质论》中&#xff0c;关于这方面的知识在 《第十八章 反射、特性和动态编程》&#xff1b;在《C# 7.0 核心技术指南》中&#xff0c;这部分内容在《第19章 反射和元数据》。[图片来自 《C# 7.0 本质论》]在这里我们可以获得一些关联性很…

数据结构基础概念、逻辑结构、物理结构

数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。也就是说&#xff0c;数组结构指的是数据集合及数据之间关系的集合&#xff0c;是两个集合。 数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#…

收藏!推荐12个超实用的Visual Studio插件

工欲善其事&#xff0c;必先利其器,整理的一些我必装的12款Visual Studio插件&#xff0c;希望你们能get到。效率工具前文传送门&#xff1a;推荐&#xff1a;程序员必装的10款谷歌插件程序员必备的8个学习工具99%的人不知道搜索引擎的6个技巧01 CodeMaidCodeMaid快速整理代码文…

数据结构选择题(c语言)

1.若有char w; int x; float y; double z; 则表达式w*xz-y值的数据类型为&#xff08; &#xff09;。 (2分) A.float B.char C.int D.double D 解析&#xff1a; 整形和浮点型计算&#xff0c;结果为浮点型&#xff1b;单精度和双精度计算&#xff0c;结果为双精度 因为在计算…

搭建独立博客,这款评论插件不能错过

微信公众号因为申请的时间晚&#xff0c;一直到现在都无法开通评论功能&#xff0c;之前博客一直使用的多说作为评论系统&#xff0c;自从多说关闭后&#xff0c;好多年都处于无评论状态&#xff0c;最近发现 gitalk 还不错&#xff0c;所以在博客中进行了对 gitalk 的集成&…

最大堆和最小堆(数据结构)

堆和栈的区别&#xff1a; 一、空间分配区别&#xff1a; 栈&#xff08;操作系统&#xff09;&#xff1a;由操作系统自动分配释放&#xff0c;存放函数的参考值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈堆&#xff08;操作系统&#xff09;&#xff1a;一…

2019公众号总结之——Top100 技术文章汇总

大家好&#xff0c;我是张善友。新年伊始&#xff0c;我们在欢送10年代的同时迎来了20年代。在这个崭新的时代&#xff0c;感谢各位朋友一直关注“dotnet跨平台”。一晃5年有余&#xff0c;关注公众号的粉丝6万&#xff0c;相对于.NET开发人员&#xff0c;希望2020年有更多小伙…

树,森林,二叉树的互相转换

树、森林到二叉树的转换 将树转换为二叉树 树中每个结点最多只有一个最左边的孩子&#xff08;长子&#xff09;和一个右邻的兄弟。按照这种关系很自然地就将树转换成相应的二叉树&#xff1a; 在所有兄弟结点之间加一连线对每个结点&#xff0c;除了保留与其长子的连线外&am…

数据丢失引起宕机怎么办?

做过系统开发和运维的朋友&#xff0c;应该最怕数据丢失问题出现&#xff0c;更严重的是造成无法恢复的糟糕境地&#xff0c;简直叫人崩溃啊&#xff0c;这周有一个朋友跟我咨询这方面的事情&#xff0c;就整理了一下数据库自动异地备份的方法&#xff0c;分享给大家。大家都知…

python字典(Dict)

字典的创建 字典的访问&#xff08;List转换&#xff09; 字典的遍历 字典的添加 字典的合并 字典的删除&#xff08;清空&#xff09; 字典的其他操作 字符串转字典&#xff08;eval&#xff09; 字典的创建 dict1{"A":1,"B":2,"C":99} //直接…

ASP.NET Core跨平台技术内幕

ASP.NET Core设计初衷是开源跨平台、高性能Web服务器&#xff0c;其中跨平台特性较早期ASP.NET是一个显著的飞跃&#xff0c;.NET现可以理直气壮与JAVA同台竞技&#xff0c;而ASP.NET Core的高性能特性更是成为致胜法宝。ASP.NET Core 2.1为IIS托管新增In-Process模型并作为默认…

6-23 分离链接法的删除操作函数 (20 分)

试实现分离链接法的删除操作函数。 函数接口定义&#xff1a; bool Delete( HashTable H, ElementType Key );其中HashTable是分离链接散列表&#xff0c;定义如下&#xff1a; typedef struct LNode *PtrToLNode; struct LNode {ElementType Data;PtrToLNode Next; }; typed…

使用 Visual Studio Code 进行远程开发

在完成了 AT 指令入门的学习之后&#xff0c;接下来就要使用 AT 指令进行 Socket 通信了。问题在于&#xff0c;之前 .NET 的 Socket 编程只需一台电脑便可进行学习&#xff0c;服务器和客户端都可以在本机运行&#xff0c;也可以分别运行在局域网上的两台电脑之上。而 NB-IOT …

AI人工智能

1&#xff0c;为什么要对特征做归一化&#xff1f; 2&#xff0c;什么是组合特征&#xff1f;如何处理高维组合特征&#xff1f; 3&#xff0c;请比较欧式距离与曼哈顿距离&#xff1f; 4&#xff0c;为什么一些场景中使用余弦相似度而不是欧式距离&#xff1f; 5&#xff0c;O…

python练习题

一、 请编写程序&#xff0c;使得能够计算以下算术运算并打印结果&#xff1a;9的3次方 print(9**3)二、 给你一个整数&#xff0c;代表Tom的妈妈买的书本的数量&#xff0c;输出一段英文&#xff0c;能完整表述Tom的妈妈买了几本书。本题考查字符串的组合、数据类型的变换、变…

.NETCore3.1中的Json互操作最全解读-收藏级

前言本文比较长&#xff0c;我建议大家先点赞、收藏后慢慢阅读&#xff0c;点赞再看&#xff0c;形成习惯&#xff01;我很高兴,.NETCore终于来到了3.1LTS版本&#xff0c;并且将支持3年&#xff0c;我们也准备让部分业务迁移到3.1上面&#xff0c;不过很快我们就遇到了新的问题…

在一个数组中实现两个堆栈

6-11 在一个数组中实现两个堆栈 (20 分) 本题要求在一个数组中实现两个堆栈。 函数接口定义&#xff1a; Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag );其中Tag是堆栈编号&#xff0c;取1或2&…

逻辑结构的四种基本关系

逻辑结构的四种基本关系 1集合结构&#xff1a;数据元素之间除了“属于同一集合”的关系外&#xff0c;没有其他关系 2线性结构&#xff1a;数据元素之间存在一对一的关系 3树结构&#xff1a;数据元素之间存在一对多的关系 4图结构&#xff1a;数据元素之间存在多对多的关系

轻量级开源小程序SDK发车啦

Magicodes.WxMiniProgram.Sdk轻量级微信小程序SDK&#xff0c;支持.NET Framework以及.NET Core。目前已提供Abp模块的封装&#xff0c;支持开箱即用。地址&#xff1a;https://github.com/xin-lai/Magicodes.WxMiniProgram.SdkNuget新的包主要功能轻量级微信小程序SDK&#xf…