ASP.NET Core中间件的概念及基本使用

embedded/2025/2/8 2:16:31/

什么是中间件

中间件ASP.NET Core核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件

  1. 广义上来讲:Tomcat、WebLogic、Redis、IIS;狭义上来讲,ASP.NET Core中的中间件ASP.NET Core中的一个组件。
  2. 中间件前逻辑、next、后逻辑3部分组成,前逻辑为第一段要执行的逻辑代码、next为指向下一个中间件的调用、后逻辑为从下一个中间件执行返回所执行的逻辑代码。每个HTTP请求都要经历一系列中间件的处理,每个中间件对于请求进行特定的处理后,再转到下一个中间件,最终的业务逻辑代码执行完成后,响应的内容也会按照处理的相反顺序进行处理,然后形成HTTP响应报文返回给客户端。
  3. 中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。开发人员可以对组成管道的中间件按照需要进行自由组合。

中间件的三个概念

Map、Use和Run。Map用来定义一个管道可以处理哪些请求,Use和Run用来定义管道,一个管道由若干个Use和一个Run组成,每个Use引入一个中间件,而Run是用来执行最终的核心应用逻辑。

中间件的基本使用

此为案例,不推荐这样使用

app.Map("/test", async (appBuilder) =>
{appBuilder.Use(async (context, next) =>{context.Response.ContentType = "test/html";await context.Response.WriteAsync("1 Start<br/>");await next();await context.Response.WriteAsync("1 End<br/>");});appBuilder.Use(async (context, next) =>{await context.Response.WriteAsync("2 Start<br/>");await next();await context.Response.WriteAsync("2 End<br/>");});appBuilder.Run(async context =>{await context.Response.WriteAsync("Run<br/>");});
});

中间件

简单的自定义中间件

  1. 如果中间件的代码比较复杂,或者我们需要重复使用一个中间件的话,我们最好把中间件的代码放到一个单独的“中间件类”中。
  2. 中间件类是一个普通的.NET类,它不需要继承任何父类或者实现任何接口,但是这个类需要有一个构造方法,构造方法至少要有一个RequestDelegate类型的参数,这个参数用来指向下一个中间件。这个类还需要定义一个名字为Invoke或InvokeAsync的方法,方法至少有一个HttpContext类型的参数,方法的返回值必须是Task类型。中间件类的构造方法和Invoke(或InvokeAsync)方法还可以定义其他参数,其他参数的值会通过依赖注入自动赋值。

需求

检查请求中是否有password=123的查询字符串,而且会把请求报文体按照Json格式尝试解析为dynamic类型的对象,并且把dynamic对象放入context.Items中供后续的中间件或者Run使用。

实现

Nuget:Install-Package Dynamic.Json

public class CheckMiddleware
{private readonly RequestDelegate _next;public CheckMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context){//从请求的查询字符串中获取名为password的参数值string password = context.Request.Query["password"];if (password == "123"){//检查请求的内容类型是否为JSONif (context.Request.HasJsonContentType()){//获取请求体的流Stream stream = context.Request.BodyReader.AsStream();//将流中的JSON数据解析为动态对象,并将解析后的对象存入Items集合dynamic obj = await DJson.ParseAsync(stream);context.Items["BodyJson"] =obj;}await _next(context);}else{context.Response.StatusCode = 403;}}
}Program.cs
app.Map("/test", async (appBuilder) =>
{appBuilder.UseMiddleware<CheckMiddleware>();appBuilder.Run(async context =>{dynamic? obj = context.Items["BodyJson"];if (obj != null){await context.Response.WriteAsync($"{obj}");}});
});


http://www.ppmy.cn/embedded/160432.html

相关文章

深度学习 - 神经网络的原理

## 深度学习 - 神经网络的原理 深度学习是机器学习的一个分支&#xff0c;其核心是模拟人脑神经网络的结构和功能&#xff0c;构建多层的神经网络模型&#xff0c;从数据中学习特征并进行预测或分类。 **神经网络的基本原理&#xff1a;** 1. **神经元模型:** * 神经网…

扬帆数据结构算法之舟,启航C++探索征途——LeetCode深度磨砺:顺序表技术精进实践

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 顺序表练习1.移除数组中指定的元素方法1&#xff08;顺序表&#xff09;方法2&#xff08;双指针&#xff09; 2.删除有序数组中的重复项…

数据结构-基础

1、概念&#xff1a; 程序 数据结构 算法 2、程序的好坏 可读性&#xff0c;稳定性&#xff0c;扩展性&#xff0c;时间复杂度&#xff0c;空间复杂度。 3、数据结构 是指存储、组织数据的方式&#xff0c;以便高效地进行访问和修改。通过选择适当的数据结构&#xff0c; 能…

「全网最细 + 实战源码案例」设计模式——模板方法模式

核心思想 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;定义了一个算法的骨架&#xff08;模板&#xff09;&#xff0c;将某些步骤延迟到子类中实现&#xff08;在不修改结构的情况下&#xff09;&#xff0c;以避免代码重复…

音频录制一般在什么情况下会选择保存为PCM?什么情况会选择保存为WAV?

在音频开发中,选择保存为 PCM 或 WAV 格式取决于具体的应用场景和需求。以下是两种格式的特点以及适用场景的分析: PCM 格式 特点: 原始音频数据: PCM 是未压缩的原始音频数据,没有任何文件头或元数据。数据直接以二进制形式存储,通常是采样点的值。文件体积较大: 由于…

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天&#xff0c;为站点或应用部署 HTTPS 已经成为一种常态。然而&#xff0c;手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例&#xff0c;基于 Docker 容器来搭建一个…

ISP代理与住宅代理的区别

代理充当用户和互联网之间的中介&#xff0c;在增强安全性、隐私和可访问性方面提供多种功能。在众多代理类型中&#xff0c;ISP和住宅代理脱颖而出&#xff0c;各自拥有不同的功能和应用程序。 一、ISP代理 ISP代理&#xff0c;俗称Internet服务提供商代理&#xff0c;通过其…

VoIP中常见术语

在 VoIP&#xff08;Voice over Internet Protocol&#xff0c;基于互联网协议的语音传输&#xff09;技术中&#xff0c;涉及许多专业术语。以下是常见术语及其含义&#xff1a; 1. 核心协议相关 SIP&#xff08;Session Initiation Protocol&#xff0c;会话发起协议&#xf…