【Web.路由]——路由原理
这篇文章,我们来讲一讲什么是路由。
路由是
将用户请求地址映射为一个请求委托的过程,负责匹配传入的Http请求,然后将这些请求发送到应用的可执行终结点。
这里需要注意一个内容,发送到应用的可执行终结点。
路由的分类:
常规路由和属性路由,
常规路由
常规路由在asp.net core程序中可以看出是
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
以上是简化的模式,原先模式为
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default"
,
pattern: "{controller=Student}/{action=Index}/{id?}");
});
思路就是一个控制器将指定的URL进行解析,真正进行终结点的操作就是通过使用useEndpoints()了实现。
属性路由
在创建的程序中,我们可以看到属性路由的终结点定义如下
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
简化后如下
app.MapControllers();
对于RESTFul API,微软推荐使用属性路由,它在控制器或操作上定义。
那么什么是终结点路由呢?
终结点路由
我们先看一下这段代码
在此代码中,其中有 2 个是与路由相关的中间件:
(1). UseRouting()中间件。
(2). MapControllerRoute()中间件。
这 2 个中间件是成对出现的,相互依赖,缺谁都不能完整的实现路由功能。
网上查找信息后发现:
必须先执行 UseRouting(),再执行 MapControllerRoute()。UseAuthorization()授权中间件是要放在二者中间的,对于生成的终结点进行授权,以便在执行时是带有权限的。在执行 UseRouting()中间件时,也会执行 MapControllerRoute()中间件,二者是一体的,不可分开执行。之所以在注册时分开,是因为微软推出的管道式编程,提供更大的扩展性,允许开发者在 UseRouting()和 MapControllerRoute()之间加入其它中间件获取 HttpContext 对象做一些其它的操作。
路由服务
路由服务是在 Program.cs 中使用 builder.Services.AddRouting()注册的,只是默认在 builder 之前已经注册过了,无需我们再次注册。
AddRouting()方法必须在 UseRouting()方法之前运行,它是路由的基础服务。
UseRouting
此方法中会在IApplicationBuilder 注册一个名称为EndpointRoutingMiddleware 的中间件,核心功能是
(1). 在执行 UseRouting()时,也会执行 UseEndpoints(),所以会根据 URL 格式(也就是 MapControllerRoute()方法中配置的)将整个应用程序中的所有 Controller(控制器)和 Action(操作)转换为对应的终结点
(Endpoint)。
(2). 建立请求路径与终结点之间的关系,以便 HTTP 请求到达后能够寻找到正确的终结点。
(3). 创建一个 matcher 对象,用于匹配HTTP 请求的路径,也就是根据传过来的 HTTP 请求路径匹配到正确的终结点。
(4). 使用的是 SetEndpoint()方法将终结点附加到 HttpContext 当前上下文。
一句话总结,UseRouting()的功能就是根据 HTTP 请求匹配到正确的终结点。如果向看一下到时候路由过去的终结点是在哪里,可以在program中加入以下代码
app.Use((context, next) => {
//得到终结点
var endpoint = context.GetEndpoint();
//得到路由数据
var routeData = context.Request.RouteValues;
return next();
});
在这里,构建好了一个 RequestDelegate 委托,这个就是供UseEndpoints()中间件最终执行的请求委托,类型是Func<HttpCotnext,Task>
所以根据以上分析,就可以得出——>
一个终结点就是一个处理请求的委托,其中包含控制器,action和attribute等。
UseEndpoints()
在这里你可能会有个疑问,就是我请求了,到了终结点了,该怎么返回给我才能响应到前端?
在 UseEndpoints()方法中注册了一个 EndpointMiddleware 中间件用于执行请求委托。
从 UseRouting()执行后得到最终与当前请求匹配的终结点,在UseEndpoints()中调用终结点的委托处理请求,从而找到执行的控制器和操作,得到响应的结果并返回给用户。
前文中说到,为什么要成对出现
(1). UseRouting()中间件。
(2). MapControllerRoute()中间件。
那是因为(1)是为了将所有的终结点存放在endPoint.DataSource属性中,而在UseEndPoints中,——》再存入到RouteOptions集合中。经过了UseRouting和MapControllerRoute执行后,整个应用程序的路由表就生成了,之后就可以匹配到终结点,从而执行相应的请求委托。
如果中间存在UseAuthorization(),会增加一个校验来做判断是否有权限执行,没有将直接返回。
相关文章:
【Web.路由]——路由原理
这篇文章,我们来讲一讲什么是路由。 路由是 将用户请求地址映射为一个请求委托的过程,负责匹配传入的Http请求,然后将这些请求发送到应用的可执行终结点。 这里需要注意一个内容,发送到应用的可执行终结点。 路由的分类&#x…...
Spring Boot技术在中小企业设备管理中的应用
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
Lua表(Table)
软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua中的表(table)是一种核心数据结构,它既是数组也是字典,能够存储多种类型的数据,包括数字、字符…...
51单片机应用开发(进阶)---外部中断(按键+数码管显示0-F)
实现目标 1、巩固数码管、外部中断知识 2、具体实现:按键K4(INT1)每按一次,数码管从0依次递增显示至F,再按则循环显示。 一、共阳数码管 1.1 共阳数码管结构 1.2 共阳数码管码表 共阳不带小数点0-F段码为ÿ…...
怎么区分主谓宾I love you与主系表I am fine? 去掉宾语看句子完整性 主系表结构则侧重于描述主语的状态、特征或性质
主谓宾与主系表是英语句子结构中的两种基本类型,它们在关注点、动词分类以及句子完整性方面有所区别。具体分析如下: 关注点 主谓宾I love you:主谓宾结构主要关注动作和影响对象之间的关系[1]。这种结构强调的是动态和行为,通常描…...
私域流量运营的误区
私域流量运营是近年来营销领域的重要趋势,但在实际操作中,很多企业和个人容易陷入一些误区。以下是几个常见的私域流量运营误区及其解决方法: 1. 只关注流量,不重视内容 误区:许多运营者认为,只要吸引到足…...
VirtualBox虚拟机桥接模式固定ip详解
VirtualBox虚拟机桥接模式固定ip详解 VirtualBox 桥接设置Ubuntu 24.04使用固定IP问题记录 VirtualBox 桥接设置 为什么设置桥接模式?桥接模式可以实现物理机和虚拟机互相通信,虚拟机也可以访问互联网(推荐万金油),物…...
面试问题基础记录24/10/24
面试问题基础记录24/10/24 问题一:LoRA是用在节省资源的场景下,那么LoRA具体是节省了内存带宽还是显存呢?问题二:假如用pytorch完成一个分类任务,那么具体的流程是怎么样的?问题三:详细介绍一下…...
中国区 Microsoft365主页链接请您参考:
Microsoft365主页链接请您参考: Redirecting PPAC链接请您参考: Power Platform admin center 关于Power Automate开启工单是在 https://portal.partner.microsoftonline.cn/Support/SupportOverview.aspx进行提交的。 对应所需对应管理员可以分配以下…...
Go encoding/json库
JSON在网络上广泛使用,是一种基于文本的数据传输方式。在本集中,我们将与 Daniel Marti 一起探索 Go 的 encoding/json 包和其他包。 本篇内容是根据2020年7月份[#141 {“encoding”:“json”}](https://changelog.com/gotime/141 “#141 {“encoding”…...
「实战应用」如何用图表控件LightningChart可视化天气数据?(二)
LightningChart.NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科学…...
苹果瑕疵数据集苹果质量数据集YOLO格式VOC格式 深度学习 目标检测 数据集
一、数据集概述 数据集名称:2类苹果图像数据集 数据集包含两类样本:正常苹果和有瑕疵的苹果。正常苹果样本代表完好的苹果,而有瑕疵的苹果样本代表苹果表面可能存在的损伤、瑕疵或病害。每个样本都经过详细标记和描述,以便训练模…...
旧电脑安装Win11提示“这台电脑当前不满足windows11系统要求”,安装中断。怎么办?
前言 最近有很多小伙伴也获取了LTSC版本的Win11镜像,很大一部分小伙伴安装这个系统也是比较顺利的。 有顺利安装完成的,肯定也有安装不顺利的。这都是很正常的事情,毕竟这个镜像对电脑硬件要求还是挺高的。 有一部分小伙伴在安装Windows11 …...
深入理解QT多线程编程
文章目录 多线程用法QThread类QtConcurrent类QFutureSynchronizer类获取线程信息线程优先级获取线程状态线程局部存储使用线程池监听线程事件Qt是一个跨平台的应用程序开发框架,广泛应用于图形用户界面(GUI)开发。它提供了强大的多线程支持,允许开发者在应用程序中创建和管理…...
React四官方文档总结一UI与交互
代码下载 React官网已经都是函数式组件文档,没有类组件文档,但是还是支持类组件这种写法。 UI 描述 组件 组件 是 React 的核心概念之一,它们是构建用户界面(UI)的基础。React 允许你将标签、CSS 和 JavaScript 组…...
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
文章目录 一、什么是 HTTP?无状态的含义 二、为什么 HTTP 是无状态的?三、Cookie 和 Session 的引入1. Cookie特点:示例: 2. Session特点:示例(Java Servlet): 四、HTTP、Cookie 和 …...
OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 K-最近邻(K-nearest neighbours, KNN)基于的背景/前景分割算法。 该类实现了如 319中所述的 K-最近邻背景减除。如果前景…...
android黑屏问题记录
近期出现了一个黑屏问题: 仪表显示,主副屏黑的 :原因背光开启太晚,导致拍照时候是黑的,太晚的原因是绘制进程出现异常导致重启延后了时间,绘制进程crash原因是hwc调用底层库卡住,需更新hwc对应的…...
SIP 业务举例之 Call Forwarding - No Answer(无应答呼叫转移)
目录 1. Call Forwarding - No Answer 简介 2. RFC5359 的 Call Forwarding - No Answer 信令流程 呼转开始 呼转完成 3. Call Forwording - No Answer 过程总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 …...
EFCore pgsql Join 查询
安装包 > Microsoft.EntityFrameworkCore 6.0.35 6.0.35> Microsoft.EntityFrameworkCore.Tools 6.0.35 6.0.35> Npgsql.EntityFrameworkCore.PostgreSQL 6.0.29 6.0.29定义实体等 using Microsoft.EntityFrameworkCore; using Micros…...
力扣80:删除有序数组中重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1&a…...
等保测评:安全计算环境的详细讲解
安全计算环境是信息安全领域中的一个重要概念,旨在确保在计算过程中数据的机密性、完整性和可用性。随着信息技术的迅猛发展和网络攻击的日益频繁,构建安全计算环境显得尤为重要。本文将详细探讨安全计算环境的主要组成部分、特性及其在信息安全中的作用…...
[Java基础] Lambda 表达式
往期回顾 [Java基础] 基本数据类型 [Java基础] 运算符 [Java基础] 流程控制 [Java基础] 面向对象编程 [Java基础] 集合框架 [Java基础] 输入输出流 [Java基础] 异常处理机制 [Java基础] Lambda 表达式 目录 概述 Lambda 表达式的基本语法 应用场景 并发编程 集合…...
《深入掌握高德地图 API:全面调用指南与最佳实践》
本文 高德地图 API 调用指南引言高德 API 的基础设置注册和获取 API Key 基本 API 调用结构地理编码与逆地理编码地理编码(Geocoding)逆地理编码(Reverse Geocoding)注意事项 路径规划(Direction API)驾车路…...
【功能安全】系统架构设计
目录 01 系统架构介绍 02 投票逻辑架构介绍 03 SIS架构 04 ADS域控制器架构设计 01 系统架构介绍 法规GBT 34590 Part4 part10定义的软件要求、设计和测试子阶段之间的关系(其中的3-7个人建议翻译为初始架构设计更合理 ) 系统架构的作用…...
FPGA实现PCIE视频采集转USB3.0输出,基于XDMA+FT601架构,提供3套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的PCIE方案本博已有的USB通信方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存FT601功能和硬件电路FT601读时序解读FT601写时序解读U…...
基于docker-compose编排部署微服务快速开发框架
1. 规划节点 节点规划,见表1。 表1 节点规划 IP主机名节点10.24.2.10masterdocker-compose节点 2. 基础准备 Docker和Docker Compose已安装完成,将提供的软件包Pig.tar.gz上传至master节点/root目录下并解压。 案例实施 1. 基础环境准备 &#x…...
【Java面试——并发编程——相关类和关键字——Day6】
1. Future 1.1 Future类 Future 类是异步思想的典型运用,主要用在一些需要执行耗时任务的场景,避免程序一直原地等待耗时任务执行完成,执行效率太低。具体来说是这样的:当我们执行某一耗时的任务时,可以将这个耗时任…...
Android 两种方式实现类似水波扩散效果
两种方式实现类似水波扩散效果,(相比较而言,自定义view的效果更好点,动画实现起来更方便点。) 自定义view实现动画实现 自定义view实现 思路分析:通过canvas画圆,每次改变圆半径和透明度&…...
基于SSM+小程序的垃圾分类管理系统(垃圾2)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的垃圾分类管理系统实现了管理员及用户。 1、管理员功能结构图,管理员功能有个人中心,管理员管理,基础数据管理、论坛管理、垃圾信息管理…...
一个企业官网多个营销型网站/市场营销毕业后找什么工作
基于vue2.5.9版本 数据绑定v-bind 像img这样的标签,直接在src里面写<img src"{{picimg}}" alt"">;是不正确的,这里需要用v-bind来绑定;简写为:src,同时还没有{{ }};…...
想弄个网站/长春百度推广电话
最近公司又上了一台服务器,以前都是用centos 6系统,这次选择使用了centos 7系统的安装镜像,因为现在程序版本在centos 7上一般php默认就是5.4以上的,mysql也变成了mariadb,但使用都一样而已,apache安装的ht…...
用织梦做网站都需要用什么/广州网站建设方案维护
程序员可以做哪些副业? 作为一名程序员,除了敲代码之外还应该有一些副业。什么是副业?副业就是主要事业以外附带经营的事业。我们都是程序员,大多数都是普通人,都在替别人打工,虽然收入在别人眼中挺高&…...
云虚拟主机怎么建设网站/长沙专业seo优化公司
在工作队列一章中,我们学会了如何使用工作队列来处理多个工作进程间分发任务,但如果我们想要运行远程计算机上的函数来获得结果呢?这就是本章要处理的问题RPC。本节我们会使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RP…...
东莞一站式网站推广运营/网站外贸推广
为什么80%的码农都做不了架构师?>>> 亲身经历总结如下,程序员想承接上百万的大型软件项目,必须要具备以下几点必要的条件: 01:过关的软件开发技术技能,必须需要在行业内有一定的知名度…...
南京专业做网站的公司/百度提交工具
原文地址为: IE6和IE7共存方法(别人是别人的,我是我的)2009年9月3日更新 本文是较老的文章,最新的共存方法,建议使用IETester最新版。最近版IETester的下载和介绍,请阅读文章《IETester更新至v0…...