ASP.NET Core 3.x - 为什么采用新的 Endpoint Routing 路由系统

Endpoint Routing 路由系统

ASP.NET Core 3.x 使用了一套叫做 Endpoint Routing 的路由系统。这套路由系统在ASP.NET Core 2.2 的时候就开始露面了。

这套Endpoint Routing路由系统提供了更强大的功能和灵活性,以便能更好的处理请求。

 

早期ASP.NET Core的路由系统

我们先回顾一下早期版本的ASP.NET Core的路由系统:

在早期的ASP.NET Core框架里,HTTP请求进入中间件管道,在管道的结尾处,有一个Router中间件,也就是路由中间件。这个路由中间件会把HTTP请求和路由数据发送给MVC的一个组件,它叫做MVC Router Handler。

这个MVC 路由 Handler就会使用这些路由数据来决定哪个Controller的Action方法应该来负责处理这个请求。

然后 Router中间件就会执行被选中的Action方法,并生成响应,而这个响应就会顺着中间件的管道原路返回。

问题出在哪?

为什么早期的这套路由系统被抛弃了?它有什么问题?

第一个问题就是,在被MVC处理之前,其它的中间件不知道最后哪个Action方法会被选中来处理这个请求。这对像Authorization(授权),Cors这样的中间件会造成很大的困扰,因为他们不能提前知道该请求会被送往哪里。

第二个问题就是,这套流程会把MVC和路由的职责紧密的耦合在一起,而实际MVC的本职工作应该仅仅就是生成响应。

Endpoint Routing 路由系统前来营救

Endpoint routing 路由系统,它把MVC的路由功能抽象剥离出来,并放置到中间件管道里,从而解决了早期ASP.NET Core路由系统的那两个问题。

而在Endpoint Routing 路由系统里,其实一共有两个中间件,它们的名称有点容易混淆,但是你只要记住他们的职责即可:

  1. Endpoint Routing 中间件。它决定了在程序中注册的哪个Endpoint应该用来处理请求。

  2. Endpoint 中间件。它是用来执行选中的Endpoint,从而让其生成响应的。

所以,Endpoint Routing的流程图大致如下:

在这里,Endpoint Routing 中间件会分析进来的请求,并把它和在程序中注册的Endpoints进行比较。它会使用这些 Endpoints 上面的元数据来决定哪个是处理该请求的最佳人选。然后,这个选中的Endpoint 就会被赋给请求的对象,而其它后续的中间件就可以根据这个选中的Endpoint,来做一些自己的决策。在所有的中间件都执行完之后,这个被选中的Endpoint最终将被 Endpoint中间件所执行,而与之关联的Action方法就会被执行。

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

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

相关文章

《C++ Primer》10.1节练习

练习10.1: #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {vector<int>vi;int val;vi.push_back(45);vi.push_back(45);vi.push_back(45);vi.push_back(45);for (int i 1; i < 45; i) {vi.push_ba…

Asp.Net Core AuthorizeAttribute 和AuthorizeFilter 跟进及源码解读

一、前言IdentityServer4已经分享了一些应用实战的文章&#xff0c;从架构到授权中心的落地应用&#xff0c;也伴随着对IdentityServer4掌握了一些使用规则&#xff0c;但是很多原理性东西还是一知半解&#xff0c;故我这里持续性来带大家一起来解读它的相关源代码&#xff0c;…

1张手稿图讲明白 Kubernetes 是怎么运行的

注意&#xff1a;如果您已经知道Kubernetes的工作原理&#xff0c;那么您可能会对我之前的博文感兴趣&#xff0c;请停止使用具有管理员权限的kubeconfigKubernetes是最初由Google设计的开源工具&#xff0c;现在由 Cloud Native Computing Foundation&#xff08;CNCF&#xf…

就喜欢用vSphere部署K8s集群,不全是因为自动化!

通过努力&#xff0c;我们有了一个完整配置的工作负载域&#xff0c;其中包括一个NSX-T Edge部署。现在&#xff0c;我们准备继续使用Kubernetes 部署vSphere。通过VMware Cloud Foundation 4.0中的SDDC Manager&#xff0c;我们确保NSX-T Edge可用&#xff0c;并且还确保Workl…

同源策略_如何支持跨域

欢迎大家阅读《朝夕Net社区技术专刊》我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;01PARTCoreWebApi的调用1.在Core MVC下建立…

企业数字化转型解决方案

2020年国务院常务会议明确指出&#xff0c;依托工业互联网促进传统产业加快上线上云。此前&#xff0c;工信部也在全国工业和信息化工作会议上表示&#xff0c;2020年要实施“5G工业互联网”512工程。和5G、人工智能等同列的“新基建”&#xff0c;工业互联网成为数字时代的基础…

网站 asp和php的用途,asp和php都有什么功能?

ASP是什么&#xff1f;有什么功能&#xff1f;ASP.NET是微软开发&#xff0c;建立动态的&#xff0c;强大的&#xff0c;智能的、可扩展的网站和网际网络应用的全功能的程序语言如C或VB.NET #。它包括一个强大的安全评估的亮点&#xff0c;以及一个组织的小工具&#xff0c;可以…

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

Endpoint是什么&#xff1f;Endpoint简单的可以理解为这样的一些类&#xff0c;它们包含一个请求的委托&#xff08;Request Delegate&#xff09;和其它的一些元数据&#xff0c;使用这些东西&#xff0c;Endpoint类可以生成一个响应。而在MVC的上下文中&#xff0c;这个请求委…

java获取主机信息大全,网络编程:Java获取网络主机信息

java.net.InetAddress类表示互联网协议 (IP) 地址。有两个子类&#xff1a;Inet4Address&#xff0c; Inet6Address通过 InetAddress可以方便获取一个域名下的IP&#xff0c;也可以获取一个IP的主机名。下面是例子&#xff0c;通过程序查看51cto主机的IP信息&#xff0c;51cto是…

【项目升级】单库、多库、读写分离 · 任你选

本期配套视频&#xff1a;https://www.bilibili.com/video/BV1BJ411B7mn?p6&#xff08;点击阅读原文&#xff0c;可看&#xff0c;如果没有&#xff0c;最晚下午可看&#xff09;继上周增加【任务调度】以后&#xff0c;继续对项目进行2.0版本升级&#xff0c;其实改动的地方…

.Net微服务实战之技术选型篇

王者荣耀 去年我有幸被老领导邀请以系统架构师的岗位带技术团队&#xff0c;并对公司项目以微服务进行了实施。无论是技术团队还是技术架构都是由我亲自的从0到1的选型与招聘成型的&#xff0c;此过程让我受益良多&#xff0c;因此也希望在接下来的系列博文尽可能的与大家分享…

autohotkey php,Autohotkey+php实现免浏览器听录音

环境说明&#xff1a;Elastix 2.5ln -s /var/spool/asterisk/monitor /var/www/html/接口文件(php)&#xff1a;$conmysql_connect("localhost","root","passwd");if(!$con) echo "没有连接成功!";mysql_select_db("asteriskcdrd…

.NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...

32 | 集成事件&#xff1a;解决跨微服务的最终一致性首先看一下集成事件的工作原理它的目的时为了实现系统的集成&#xff0c;它主要是用于系统里面多个微服务之间相互传递事件集成事件的实现方式有两种&#xff0c;一种是图上显示的发布订阅的方式&#xff0c;通过 EventBus&a…

Dapper操作MySQL数据库获取JSON数据中文乱码

在项目中利用Dapper将JSON数据存储到MySQL数据库&#xff0c;结果发现JSON数据中的中文乱码&#xff0c;特此记录&#xff0c;希望对存储JSON的童鞋能有所帮助&#xff0c;文中若有错误之处&#xff0c;还望批评指正。为了引出最终问题出在什么地方&#xff0c;我们重头开始进行…

C++set容器去重法

给出一个10位数&#xff0c;它如果每个位的数都把0-9这10个数都只用了一次&#xff0c;就输出yes&#xff0c;否则输出no #include <iostream> #include <set> using namespace std; set<int>s; typedef long long LL;int main() {LL n;while (cin >>…

流传在程序员中的传说,你知道几个?

在号称从事高薪新 科技工作的程序员周遭流传着许多与他们单纯气质不符的传说在这些被神秘面纱笼罩的人群中即使是从事着同一工种都有着许许多多科学无法解释的差异老程序员们对此讳莫如深新程序员们却有时感到惶恐不安...这背后究竟是道德的扭曲还是人性的沦丧倒是都并不至于只…

C++关于getline()和getchar()的小点

getchar只能“吃”一个字符&#xff0c;而getline可以“吃”一行字符 代码如下: #include <iostream> #include <cstring> using namespace std;int main() {char c;cin>>c;string line;getline(cin,line);cout<<c<<endl;cout<<line<…

谁说docker-compose不能水平扩展容器、服务多实例?

❝虽说我已经从docker-compose走上了docker swarm的邪门歪道&#xff0c;目前被迫走在k8s这条康庄大道&#xff0c; 但是我还是喜欢docker-compose简洁有效的部署方式。❞曾其何时docker-compose非常适合开发、测试、快速验证原型&#xff0c;这个小工具让单机部署容器变得简洁…

.NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)...

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus要实现 EventBus&#xff0c;我们这里借助了 RabbitMQ&#xff0c;它的整个安装和使用的体验是非常人性化的&#xff0c;如果是在 Windows 下开发的话&#…

nginx php iconv,Nginx +PHP部署一

Nginx PHP部署一Alvin.zeng目录一、安装PHP1、Yum安装需要的包yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurs…