栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

net6的Web MVC项目实现限流功能

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

net6的Web MVC项目实现限流功能

原理:利用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(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();//添加限流支持
                opt.Filters.Add();//添加事务支持
                opt.Filters.Add();//添加异常处理支持
                opt.Filters.Add();
            });
            services.AddDbContext(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、这样限流的功能算是启用了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993317.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号