ASP.NET Core 中间件

ops/2025/2/8 1:13:15/

目录

一、常见的内置中间件

二、自定义中间件

三、中间件的执行顺序

四、其他自动逸中间件案例

1. 身份验证中间件

2、跨域中间件(CORS)


ASP.NET Core 中,中间件(Middleware)是处理 HTTP 请求和响应的组件链。你可以在 Startup.csProgram.cs 中通过 app.UseMiddleware<T>() 来添加中间件。除了使用内置的中间件,ASP.NET Core 允许你定义自己的中间件,以满足特定的业务需求。

一、常见的内置中间件

app.UseMiddleware 之前,ASP.NET Core 已经提供了很多常见的中间件,适用于不同的功能需求:

二、自定义中间件

        自定义中间件可以帮助你在 ASP.NET Core 应用中实现各种业务逻辑,如身份验证、日志记录、性能监控、错误处理、请求响应修改等。通过 app.UseMiddleware<T>() 可以将自定义中间件添加到请求管道中,实现灵活、可定制的功能。

创建中间件中间件通常是一个类,它包含一个 InvokeInvokeAsync 方法,该方法接收 HttpContext 并返回一个 Task,通常会在方法内部执行一些逻辑,然后调用管道中的下一个中间件

例如,定义一个简单的日志记录中间件

public class LoggingMiddleware
{private readonly RequestDelegate _next;public LoggingMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context){// 请求之前的日志Console.WriteLine($"Request URL: {context.Request.Path}");// 调用下一个中间件await _next(context);// 响应之后的日志Console.WriteLine($"Response Status: {context.Response.StatusCode}");}
}

RequestDelegate next: 这是管道中下一个中间件的委托。ASP.NET Core 中间件是链式的,每个中间件都会调用 next(context) 来将请求传递给管道中的下一个中间件

注册中间件: 在 Configure 方法中通过 app.UseMiddleware<LoggingMiddleware>() 来将自定义中间件添加到请求处理管道中。

public void Configure(IApplicationBuilder app)
{app.UseMiddleware<LoggingMiddleware>();// 其他中间件
}

你可以将中间件放置在管道中的不同位置,根据执行顺序来决定它的作用范围。

自定义中间件的常见应用场景:

  1. 日志记录: 可以创建一个中间件来记录每个请求的详细信息(如请求 URL、请求体、响应状态码等),以便于后期分析和排查问题。

  2. 认证与授权: 如果你有一些自定义的认证或授权逻辑,可以创建中间件来在请求处理之前进行检查。

  3. 错误处理: 自定义错误处理程序可以捕获异常并根据需要返回适当的错误信息,或者记录详细的错误信息。

  4. 性能监控: 你可以创建中间件来衡量请求的响应时间,进行性能分析,记录执行时间等。

  5. CORS 自定义: 你可以实现自定义的跨域资源共享(CORS)策略,根据请求的来源和其他条件来判断是否允许跨域访问。

  6. 请求/响应修改: 你可以在中间件中处理请求和响应数据,例如修改请求的头部信息,或者在响应中添加一些自定义的头部或数据。

  7. 请求计数与速率限制: 实现请求计数器或者速率限制器,中间件可以根据请求数量限制特定 API 的调用频率。

三、中间件的执行顺序

中间件的执行顺序是按照它们被注册的顺序来执行的。即先注册的中间件会先执行,后注册的中间件会后执行。

  • 请求管道:请求从上到下,依次通过所有中间件。每个中间件可以选择修改请求并传递给下一个中间件
  • 响应管道:响应从下到上,依次经过中间件进行修改。每个中间件都可以选择修改响应并传递给上一个中间件

四、其他自动逸中间件案例

1. 身份验证中间件

如果你想要在请求过程中对用户进行身份验证,可以创建一个中间件来检查用户的认证信息(如 JWT 令牌):

public class AuthenticationMiddleware
{private readonly RequestDelegate _next;public AuthenticationMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context){var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();if (string.IsNullOrEmpty(token)){context.Response.StatusCode = 401; // Unauthorizedawait context.Response.WriteAsync("Unauthorized");return;}// 验证 token 逻辑...// 继续处理请求await _next(context);}
}

2、跨域中间件(CORS)

创建一个中间件来根据请求的来源动态处理 CORS:

public class CorsMiddleware
{private readonly RequestDelegate _next;public CorsMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context){var origin = context.Request.Headers["Origin"];if (origin != null && origin == "https://alloweddomain.com"){context.Response.Headers.Add("Access-Control-Allow-Origin", origin);}await _next(context);}
}


http://www.ppmy.cn/ops/156595.html

相关文章

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…

[数据结构] 线性表和顺序表

目录 线性表 顺序表的实现 顺序表各个方法的实现 boolean isFull() -- 判断数组是否放满 : void add(int data) -- 在数组末尾插入新元素 : void add(int pos,int data) -- 在指定位置插入元素 : boolean contain(int toFind) -- 判断是否包含某个元素 int indexOf(in…

机器学习--python基础库之Matplotlib (2) 简单易懂!!!

python基础库之Matplotlib&#xff08;2&#xff09; python基础库之Matplotlib0 准备1 散点图的绘制2 柱状图绘制3 其他 python基础库之Matplotlib 上篇文章机器学习–python基础库之Matplotlib (1) 超级详细!!!主要讲解了python的基础库matplotlib中绘图的流程以及折线图的…

网站打开提示不安全

当网站打开时显示“不安全”提示&#xff08;通常表现为浏览器地址栏中出现“不安全”字样或红色警告图标&#xff09;&#xff0c;这意味着网站未使用有效的SSL证书或HTTPS协议&#xff0c;导致浏览器认为连接不安全。以下是解决这一问题的详细步骤&#xff1a; 一. 原因分析 …

CSS --- 设置不自动换行

介绍 在父容器添加样式 样式 white-space: nowrap;效果 文本或样式会溢出&#xff0c;不会进行自动换行展示

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种基于发布/订阅模式的轻量级通讯协议&#xff0c;构建于TCP/IP协议之上。它最初由IBM在1999年发布&#xff0c;主要用于在硬件性能受限和网络状况不佳的情…

html基本结构和常见元素

html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…

多用户同时RDP登入Win10

自备以下文件&#xff1a; winsw_frpc.xml展开如下&#xff1a; <service><!-- ID of the service. It should be unique across the Windows system--><id>winsw_frp</id><!-- Display name of the service --><name>winsw_frp</na…