当前位置:网站首页>net6的Web MVC项目实现限流功能
net6的Web MVC项目实现限流功能
2022-08-11 05:24:00 【Three Big Stones】
原理:利用MemoryCache服务组件,记录用户最后一次访问接口的时间,如果本次访问距离最后一次访问不超过1秒,提示用户访问过于频繁,否则,接口可以正常访问。然后利用拦截器可以拦截action的能力,自定义自己的限流器,结合MemoryCache组件,可以达到简单限流的目的。
1、实现限流器,主要是实现IAsyncActionFilter接口,给构造器注入缓存服务,并实现OnActionExecutionAsync方法,结合缓存功能,记录用户的ip信息作为key值,访问时间作为value。
public class RateLimitFilter : IAsyncActionFilter
{
private IMemoryCache memoryCache;
public RateLimitFilter(IMemoryCache memoryCache)
{
this.memoryCache = memoryCache;
}
public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
string remoteIP = context.HttpContext.Connection.RemoteIpAddress.ToString();
string cacheKey = $"LastVisitTick_{remoteIP}";
long? lastTick = memoryCache.Get<long?>(cacheKey);
if (lastTick == null || Environment.TickCount64 - lastTick > 1000)
{
memoryCache.Set(cacheKey, Environment.TickCount64, TimeSpan.FromSeconds(10));//距离现在10秒过期
return next();
}
else//1秒之内只允许访问一次
{
context.Result = new ContentResult{ StatusCode = 429, Content="你访问太频繁了" };
return Task.CompletedTask;
}
}
}
2、注册限流器,实现了限流器之后,我们要把它注入到IOC容器中,具体代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddMvcCore(opt => {
opt.Filters.Add<RateLimitFilter>();//添加限流支持
opt.Filters.Add<TransactionScopeFilter>();//添加事务支持
opt.Filters.Add<ExceptionFilter>();//添加异常处理支持
opt.Filters.Add<LogFilter>();
});
services.AddDbContext<BookDbContext>(opt=> {
var connectString = this.Configuration.GetSection("DbConnectionStr").Value;
opt.UseSqlServer(connectString);
});
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
});
services.AddMemoryCache();//添加缓存服务
}
3、这样限流的功能算是启用了。
边栏推荐
- 梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第五次培训
- Mei cole studios - sixth DjangoWeb application framework + MySQL database training
- 支付牌照是什么意思
- 梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第二次培训
- Hardhat Recognition System - Solving Regulatory Conundrums
- Hard hat recognition algorithm
- 防盗链——防止其他页面通过url直接访问本站资源
- 安全帽识别系统-为安全生产保驾护航
- HTTP缓存机制详解
- 秦始皇到底叫嬴政还是赵政?
猜你喜欢
随机推荐
通过字符设备虚拟文件系统实现kernel和userspace数据交换(基于kernel 5.8测试通过)
Pay “Attention” to Adverse Weather
Diagnostic Log and Trace——为应用程序和上下文设置日志级别的方法
Hard hat identification
产品如何拟定优化方案?
Hard hat recognition algorithm
Androd 基本布局(其一)
Node-1.高性能服务器
swin-transformer训练自己的数据集<自留>
梅科尔工作室-Pr第二次培训笔记(基本剪辑操作和导出)
目标检测前言
目标检测——LeNet
CVPR2020: Seeing Through Fog Without Seeing Fog
关于mmdetection框架实用小工具说明
LAGRANGIAN FLUID SIMULATION WITH CONTINUOUS CONVOLUTIONS
CNN-based Point Cloud De-Noising
目标检测——卷积神经网路基础知识
梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第四次培训
CMT2380F32模块开发4-UART例程
SWOT分析法