程序猿改变世界
假设有需求:需要对每个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
【个人微信】
【时间去哪儿了】
教育类博客,关注知识的分享与交流。
欢迎关注公众号!
加我微信
Copyright © 2014-2022 timegowhere.com. All rights reserved. 粤ICP备15081222号