当前位置:首页 » .NET编程经验 » 正文

.NET Core过滤器之限制请求访问频率的Action过滤器(ActionFilter)

2023年4月23日 14:20:28  分类: .NET编程经验  参与: 人  点这评论

假设有需求:需要对每个Action接口添加访问频率限制,即同个IP在一秒中内只允许访问一次,要怎么实现?


针对这个需求,我使用过滤器(Filters)来实现一下。

首先,先定义一个访问频率限制过滤器,命名为:RateLimitActionFilter”,代码示例:

public class RateLimitActionFilter : IAsyncActionFilter
    {
        /// <summary>
        /// 注入内存缓存
        /// </summary>
        private readonly IMemoryCache _memoryCache;
        public RateLimitActionFilter(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
        public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            // 获取IP地址
            string ip = context.HttpContext.Connection.RemoteIpAddress!.ToString();
            // 定义缓存key
            string lastVisitKey = $"lastVisitIP_{ip}";
            // 获取缓存中的Tick
            long lastVisitTick = _memoryCache.Get<long>(lastVisitKey);
            // 判断缓存
            if (lastVisitKey == null || (Environment.TickCount64-lastVisitTick)>1000)
            {
                // 将当前Tick保存至缓存中,并设置过期时间(5s),避免长时间未访问占用缓存内存
                _memoryCache.Set<long>(lastVisitKey,Environment.TickCount64,TimeSpan.FromSeconds(5));
                return next();
            }
            // 同个IP在1秒内重复访问就返回该提示,状态码429
            ObjectResult result = new ObjectResult("访问太频繁,请稍后重试!") { StatusCode = 429 };
            context.Result = result;
            return Task.CompletedTask;
        }
    }


然后在Program.cs中注册缓存服务和自定义过滤器:

//添加内存缓存服务
builder.Services.AddMemoryCache();
builder.Services.Configure<MvcOptions>(options => {
    //注册自定义的Actioin过滤器
    options.Filters.Add<RateLimitActionFilter>();
});


运行结果如下:

来源:时间去哪儿了博客(微信/QQ号:903918446),转载请保留出处和链接!

本文链接:http://timegowhere.com/post/netcore-rate-limit-action-filter.html

本文标签:.NET Core  Filters    

<< 上一篇

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

搜索

网站分类

Tags列表

最新留言

微信公众号【双语悦读】

    【个人微信】

站点地图 | 网站标签 | 给我留言

Copyright © 2014-2022 timegowhere.com. All rights reserved. 粤ICP备15081222号