参照资料:

ASP.NET Core 中间件 | Microsoft Learn

ASP.NET Core端点路由 作用原理 - 知乎 (zhihu.com)

一、概念

中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:

  • 选择是否将请求传递到管道中的下一个组件。
  • 可在管道中的下一个组件前后执行工作。
// 创建了一个 WebApplicationBuilder 实例,用于配置应用程序的服务和中间件。
var builder = WebApplication.CreateBuilder(args); // 1、配置(添加)应用程序的服务. // 1.1、在应用程序的服务容器中注册了一个控制器服务,以便能够使用 ASP.NET Core MVC 框架来处理 HTTP 请求。
builder.Services.AddControllers();
//1.2.1在应用程序的服务容器中注册了一个终结点 API 浏览器服务,以便能够使用 Swagger UI 来查看和测试 API 文档。
builder.Services.AddEndpointsApiExplorer();
//1.2.2在应用程序的服务容器中注册了一个 Swagger 生成器服务,以便能够生成和发布 Swagger/OpenAPI 文档。
builder.Services.AddSwaggerGen(); //2、使用 builder.Build() 方法构建应用程序的实例
var app = builder.Build(); //2.1检查应用程序的环境是否为开发环境,并在开发环境下使用 Swagger 和 Swagger UI 中间件,以便能够查看和测试 API 文档。
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
//2.2启用 HTTPS 重定向中间件,将所有 HTTP 请求重定向到 HTTPS。
app.UseHttpsRedirection();
//2.3启用授权中间件,以便能够使用 ASP.NET Core 身份验证和授权机制来保护应用程序的资源。
app.UseAuthorization();
//2.4将控制器路由配置到应用程序的请求处理管道中,以便能够处理 HTTP 请求并返回响应。
app.MapControllers(); //3、启动应用程序,并等待传入的请求。
app.Run();

使用 RunMapUse 扩展方法来配置请求委托。 可将一个单独的请求委托并行指定为匿名方法(称为并行中间件),或在可重用的类中对其进行定义。 这些可重用的类和并行匿名方法即为中间件,也叫中间件组件。 请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。

当中间件短路时,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。eg:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build(); app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
}); app.Run();

这路app.Run(...)就属于一个“终端中间件”,因为请求经过这个中间件的时候会让直接返回Hello world!,不会执行后续的操作

Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不调用 next 参数使管道短路。 通常可在 next 委托前后执行操作,如以下示例所示:

当委托不将请求传递给下一个委托时,它被称为“让请求管道短路”。 通常需要短路,因为这样可以避免不必要的工作。 例如,静态文件中间件可以处理对静态文件的请求,并让管道的其余部分短路,从而起到终端中间件的作用。 如果中间件添加到管道中,且位于终止进一步处理的中间件前,它们仍处理 next.Invoke 语句后面的代码。

二、中间件的顺序

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道。 你可以在典型应用中了解现有中间件的顺序,以及在哪里添加自定义中间件。 你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。

上图中的“终结点”中间件为相应的应用类型(MVC 或 Razor Pages)执行筛选器管道。

上一个图中的件中。 这是通过显式调用 app.UseRouting 实现项目模板的顺序。 如果不调用 app.UseRouting,路由中间件将默认在管道开头运行。 如果你想要使用路由中间件来实现URL路径匹配,一定要记得在管道中添加 app.UseRouting方法来确保路由中间件被执行。

路由中间件

一般配置如下

    //首先使用 app.UseRouting() 中间件启用路由系统
app.UseRouting();
//然后使用 app.UseEndpoints() 中间件配置路由规则,并将请求映射到默认的控制器和操作方法。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});

当使用 .UseEndpoints()方法来配置路由时,可以使用多种方式来实现路由配置。

下面是一些示例:

  1. 使用默认路由模板:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});

这将使用默认的路由模板来匹配控制器的操作方法。例如,如果有一个名为 ProductsController的控制器,并且其中有一个名为 GetProduct的操作方法,它将使用以下路由模板:/Products/GetProduct

  1. 自定义路由模板:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "MyRoute",
pattern: "my-route/{controller}/{action}/{id?}");
});

这将使用自定义的路由模板来匹配控制器的操作方法。在这个例子中,路由模板是 my-route/{controller}/{action}/{id?},其中 {controller}{action}{id}是占位符。这些占位符将被替换为相应的控制器、操作方法和参数。例如,如果有一个名为 ProductsController的控制器,并且其中有一个名为 GetProduct的操作方法,它将使用以下路由模板:my-route/Products/GetProduct

  1. 使用多个路由模板:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "MyRoute1",
pattern: "my-route1/{controller}/{action}/{id?}"); endpoints.MapControllerRoute(
name: "MyRoute2",
pattern: "my-route2/{controller}/{action}/{id?}");
});

这将使用多个路由模板来匹配控制器的操作方法。在这个例子中,我们定义了两个路由模板:my-route1/{controller}/{action}/{id?}my-route2/{controller}/{action}/{id?}。这些路由模板将分别匹配不同的URL路径。

.net6 中间件的更多相关文章

  1. Net6的核心组件之中间件

    Net6的核心组件之中间件 What is Middleware? 1.广义上来讲:Tomcat.WebLogic.Redis.IIS:狭义上来讲,ASP.NET Core中的中间件指ASP.NET ...

  2. .NET6 平台系列1 .NET发展史之.NET Framework简介

    系列目录     [已更新最新开发文章,点击查看详细] 自1995年互联网战略日以来最雄心勃勃的事业 -- 微软.NET战略, 2000年6月30日. 微软公司于2002年2月13日正式推出第一代.N ...

  3. .NET6 平台系列2 .NET Framework框架详解

    系列目录     [已更新最新开发文章,点击查看详细] 什么是 .NET Framework? .NET Framework 是 Windows 的托管执行环境,可为其运行的应用提供各种服务. 它包括 ...

  4. .NET6 平台系列3 .NET CLR 详解

    系列目录     [已更新最新开发文章,点击查看详细] CLR 简介 运行时(Runtime Environment,简称Runtime ),是指那些支持在特定的平台上,用于运行特定编程语言编写的软件 ...

  5. .NET6 平台系列4 .NET开源之路

    系列目录     [已更新最新开发文章,点击查看详细] .NET平台是微软于2000年推出的Windows操作系统的应用软件开发框架,发展至今形成巨大的技术栈,涉及多语言(支持C#.F#.VB.NET ...

  6. .NET6运行时动态更新限流阈值

    昨天博客园撑不住流量又崩溃了,很巧正在编写这篇文章,于是产生一个假想:如果博客园用上我这个限流组件会怎么样呢? 用户会收到几个429错误,并且多刷新几次就看到了内容,不会出现完全不可用. 还可以降低查 ...

  7. 重新整理 .net core 实践篇——— 权限中间件源码阅读[四十六]

    前言 前面介绍了认证中间件,下面看一下授权中间件. 正文 app.UseAuthorization(); 授权中间件是这个,前面我们提及到认证中间件并不会让整个中间件停止. 认证中间件就两个作用,我们 ...

  8. 简单聊下.NET6 Minimal API的使用方式

    前言 随着.Net6的发布,微软也改进了对之前ASP.NET Core构建方式,使用了新的Minimal API模式.之前默认的方式是需要在Startup中注册IOC和中间件相关,但是在Minimal ...

  9. Net6 DI源码分析Part5 在Kestrel内Di Scope生命周期是如何根据请求走的?

    Net6 DI源码分析Part5 在Kestrel内Di Scope生命周期是如何根据请求走的? 在asp.net core中的DI生命周期有一个Scoped是根据请求走的,也就是说在处理一次请求时, ...

  10. 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用

    我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...

随机推荐

  1. 一体机场景ceph高可用介绍

    本文分享自天翼云开发者社区<一体机场景ceph高可用介绍>,作者:b****n 一体机场景使用ceph开源架构作为存储系统的主体架构,原生方案支持存储数据高可用性,包括副本数可以灵活控制/ ...

  2. Rocksdb原理简介

    本文分享自天翼云开发者社区<Rocksdb原理简介>,作者:l****n Rocksdb作为当下nosql中性能的代表被各个存储组件(mysql.tikv.pmdk.bluestore)作 ...

  3. Xshell不可以删除,退格^H

    文件→属性→终端→键盘,把delete和backspace序列改为 ASCII 127即可.

  4. Git指南-从入门到精通

    代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致 第一步: 文件增删改,变为已修改状态 第二步: git add ,变为已暂存状态 $ git status $ git add --a ...

  5. Linux命令行连接蓝牙设备

    Linux命令行连接蓝牙设备 查看Bluetooth设备: hciconfig 启动一个Bluetooth设备,例如:hci0: hciconfig hci0 up 相关指令 查看特定的Bluetoo ...

  6. 动手学大模型应用开发,第4天:Prompt设计

    第一章.Prompt 设计的原则和技巧 LLM 时代 prompt 这个词对于每个使用者和开发者来说已经听得滚瓜烂熟,那么到底什么是 prompt 呢?简单来说,prompt(提示) 就是用户与大模型 ...

  7. 奥特曼autMan对接BBK-JD扫码登录+微信扫码登录

    1.BBK京东扫码容器配置 首先进入root目录 cd /root 拉取镜像创建容器 docker run -dit \ -v $PWD/conf:/data/conf \ -v $PWD/logs: ...

  8. 八米云-各种小主机x86系统-小白保姆式超详细刷机教程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 准备工作 说明: 1.小节点X86 单线500M以下 ...

  9. [tldr]通过指令获取github仓库的单个文件的内容

    针对一个公开的github仓库,有些时候不需要clone整个仓库的内容,只需要对应的几个文件.但是直接通过网页点击下载文件很麻烦,在服务器上也不好这样操作. 因此,如何使用curl或者wget指令快速 ...

  10. gin Http请求Body和Header的获取 request post form Query header

    gin Http请求Body和Header的获取 request post form Query header 请求参数 POST /post?id=1234&page=1 HTTP/1.1 ...