asp.net core web api项目添加自定义中间件

2024-09-04 00:20

本文主要是介绍asp.net core web api项目添加自定义中间件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在asp.net core web api项目中,默认提供了很多的中间件,比如访问静态文件中间件UseStaticFiles,跨域配置中间件UseCors,路由中间件UseRouting,身份验证中间件UseAuthentication

那么如何添加一些自定义的中间件呢。

需求

现在有一个需求,我们的所有接口中都有一个TimeSpan参数,传入的是当前时间的时间戳,正常需要对时间戳进行加密,然后在加一个统一的验证方法,只正常处理2分钟以内的请求,超时的请求不在处理,直接返回错误代码,这样可以一定程度上保护我们的业务数据。

这时我们就可以添加一个自定义的中间件,对所有过来的请求先进行时间戳校验处理,处理通过的再返回到业务逻辑正常处理,时间戳校验不通过的则直接返回错误码。

实现

接下来看实现。

为了演示,我还是新建一个空的asp.net core web api项目。然后调用WeatherForecastController下的Get方法来做测试。
然后添加一个类,为了简单点,这个类就一个TimeSpan参数。

 public class BaseRequest{public string TimeSpan { get; set; }}

为了方便的使用中间件,我们希望可以直接在Program下的Main函数里直接调用。类似这样。

public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers();var app = builder.Build();//这里是自定义添加的中间件app.UseRequestCheckMiddleware();app.UseAuthorization();app.MapControllers();app.Run();}

Startup里添加原理一样。
所以首先我需要添加一个ApplicationBuilder的扩展方法。这样才能调用方法一样用.出来。
添加一个ApplicationBuilderExtension类。

public static class ApplicationBuilderExtension
{public static IApplicationBuilder UseRequestCheckMiddleware(this IApplicationBuilder builder){return builder.UseMiddleware<RequestCheckMiddleware>();}}

在这个类里通过builder.UseMiddleware传入一个实现类,就可以实现中间件添加的效果了,如果想添加多个自定义的中间件,可以继续添加新的Use方法。

接下来重点就是RequestCheckMiddleware的实现。

 public class RequestCheckMiddleware
{private readonly RequestDelegate _next;public RequestCheckMiddleware(RequestDelegate next){_next= next;}public async Task InvokeAsync(HttpContext context){HttpRequest request = context.Request;//缓存下来允许多次读取request.EnableBuffering();var reader = new StreamReader(request.Body, Encoding.UTF8);string data = await reader.ReadToEndAsync();// 重置流的位置以便后续中间件可以读取  request.Body.Position = 0;try{var inputJson = JsonSerializer.Deserialize<BaseRequest>(data);// 假设 BaseRequest.TimeSpan 是一个 long 类型的 UNIX 时间戳  if (string.IsNullOrEmpty(inputJson.TimeSpan)){await HandleError(context, 500, "时间戳为空!");return;}var requestTime = UnixTimeStampToDateTime(Convert.ToInt64(inputJson.TimeSpan));if (DateTime.Now - requestTime > TimeSpan.FromMinutes(2)){await HandleError(context, 429, "超时请求!");return;}await _next(context);}catch (Exception ex){await HandleError(context, 400, $"处理请求失败: {ex.Message}");}}private async Task HandleError(HttpContext context, int statusCode, string message){context.Response.StatusCode = statusCode;var result = new { code = statusCode, message = message, result = new object() };await context.Response.WriteAsync(JsonSerializer.Serialize(result));}private DateTime UnixTimeStampToDateTime(long unixTimeStamp){// UNIX 时间戳转换为 DateTime  DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);dateTime = dateTime.AddSeconds(unixTimeStamp).ToLocalTime();return dateTime;}
}

这里有几点可以解释一下。
1、这里的主函数名必须是Invoke或者InvokeAsync,且入参是HttpContext。表示这是在请求管道中对请求进行处理的中间件。
2、这里需要定义RequestDelegate的委托,因为需要在当前逻辑处理完成后,还需要把请求传递到下一步。
3、request.Body默认只能被读取一次,为了传递到下一步依然有原模原样的请求参数,所以需要先对请求进行缓存处理。读取完成之后,需要把流的位置重置到开始。方便后面可以再次读取请求内容。

然后在Program里添加对应中间件就行了。

 //这里是自定义添加的中间件app.UseRequestCheckMiddleware();

验证

最后来演示一下效果。
首先传递一个2分钟内正常的时间戳。
在这里插入图片描述
请求可以正常返回。

接着等一会吧,等时间戳过期。
在这里插入图片描述

结语

Study hard and make progress every day.

欢迎关注下方微信公众号,一起学习,一起娱乐,一起进步,点击卡片可以查看公众号二维码哟。

这篇关于asp.net core web api项目添加自定义中间件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134460

相关文章

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.