欢迎来到科站长!

ASP.NET

当前位置: 主页 > 网络编程 > ASP.NET

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

时间:2025-01-06 11:08:05|栏目:ASP.NET|点击:

前言

在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();
     }
 }

在这个类里通过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(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分钟内正常的时间戳。

在这里插入图片描述

请求可以正常返回。

接着等一会吧,等时间戳过期。

在这里插入图片描述

到此这篇关于asp.net core web api项目添加自定义中间件的实现的文章就介绍到这了,更多相关asp.net core web api中间件内容请搜索科站长以前的文章或继续浏览下面的相关文章希望大家以后多多支持科站长!

上一篇:ASP.NET WebForms实现全局异常捕获与处理的最佳实践

栏    目:ASP.NET

下一篇:ASP.NET Core Web API之Token验证的实现

本文标题:asp.net core web api项目添加自定义中间件的实现

本文地址:https://www.fushidao.cc/wangluobiancheng/3316.html

广告投放 | 联系我们 | 版权申明

申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:257218569 | 邮箱:257218569@qq.com

Copyright © 2018-2025 科站长 版权所有冀ICP备14023439号