.net 6 web项目中使用IAsyncActionFilter 来设置ip请求限流

工具:visualStudio 2022

.net版本为6.0

项目需求:每个ip1秒内只能请求一次

1、创建一个类继承自定义筛选器IAsyncActionFilter ,在OnActionExecutionAsync方法中实现我们的功能。

 public class RateLimitFilter : IAsyncActionFilter
    {
        // 引入内存缓存
        private readonly IMemoryCache memoryCache;

        public RateLimitFilter(IMemoryCache memoryCache)
        {
            this.memoryCache = memoryCache;
        }

        public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            // 获取IP
            string ip = context.HttpContext.Connection.RemoteIpAddress.ToString();

            // 设置cache的Key
            string key = $"LastVisitTick_{ip}";
            //在缓存中获取key记录 允许为空
            long? lastTick = memoryCache.Get<long?>(key);

            // 如果没有lasttick 或者当前时间-lasttick的值大于1秒钟
            if (lastTick == null || Environment.TickCount64 - lastTick > 1000)
            {
                // 重新设置缓存过期时间,
                // Environment.TickCount64是一个64位整数,表示从系统启动开始经过的微秒数。它通常用于计时和性能测量。
                //TimeSpan.FromSeconds(10)表示一个时间跨度,从当前时间开始,经过10秒钟。
                //在这个例子中,它被用来设置内存缓存中数据的有效期为10秒。
                memoryCache.Set(key, Environment.TickCount64, TimeSpan.FromSeconds(10));

                // 放行 
                return next();
            }
            else
            {
                // 否则就拦截
                context.Result = new ContentResult { StatusCode = 429 };
                //表示返回一个已经完成的任务。
                //这个方法通常用于异步编程中,当一个任务已经完成时,可以使用这个方法来避免抛出异常。
                return Task.CompletedTask;
            }


        }

2、在program.cs中注入内存缓存自定义筛选器

   // 注入内存缓存
            builder.Services.AddMemoryCache();

            // 这段代码是用于配置ASP.NET Core MVC应用程序中的全局过滤器。
            // 它将一个名为RateLimitFilter的自定义过滤器添加到MVCOptions中,
            // 以便在所有控制器和视图中使用该过滤器。
            builder.Services.Configure<MvcOptions>(options =>
            {
                options.Filters.Add<RateLimitFilter>();
            });

3、运行项目

这时我们刷新页面就可以看到效果,如果1秒内频繁刷新,将会返回429.大家可以根据自己项目需求来实现不同的效果。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值