工具: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.大家可以根据自己项目需求来实现不同的效果。