如何在 Asp.Net Core 中对请求进行限流
译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html
在应用程序开发时,或许你有这样的想法,控制用户的请求频率来防止一些用户的恶意攻击,具体的说就是:为了预防有名的 拒绝服务 攻击,限制某一个ip在一段时间内的访问次数,要解决这个问题,就要用到限流机制。
限流能够很好的控制住一个客户端访问服务器资源地址的请求次数,在 asp.net core 之前,要实现限流机制,你可能要自定义 module 或者 handler,太繁琐了,不过很开心的是,在 asp.net core 里,可以很轻松的实现限流功能,这得益于 asp.net core 特有的 pipeline 机制,接下来,我们一起研究一下如何在 asp.net core 中实现限流机制。
安装 限流中间件
为了能够实现限流功能,可以使用第三方提供的限流中间件,利用这个中间件给多个场景进行限流,比如:允许某一个 ip 或者 ip段 在指定的时间周期内访问某一个资源的次数,这个周期可以是:每秒,每分钟,每 n 分钟,等等。
在 Visual Studio 中创建好 ASP.NET Core API 之后,下一步就是安装 限流包 AspNetCoreRateLimit
,你可以在 NuGet Package Manager
可视化工具上安装,也可以在 .NET CLI 命令行中安装,语句如下:
dotnet add package AspNetCoreRateLimit
如果想了解限流包 AspNetCoreRateLimit 的更多知识,参考 github:https://github.com/stefanprodan/AspNetCoreRateLimit
配置 AspNetCoreRateLimit
现在 AspNetCoreRateLimit 已经引用到我们项目中了,接下来在 ConfigureServices 方法中追加如下代码,最终将请求追加到 request-response pipeline
管道中。
public class Startup{// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);services.AddOptions();services.AddMemoryCache();services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimit"));services.AddSingleton<IIpPolicyStore,MemoryCacheIpPolicyStore>();services.AddSingleton<IRateLimitCounterStore,MemoryCacheRateLimitCounterStore>();services.AddSingleton<IRateLimitConfiguration,RateLimitConfiguration>();services.AddHttpContextAccessor();}}
上面代码 Configuration.GetSection("IpRateLimit")
需要注意一下, 节点 IpRateLimit 的具体限流信息是配在 appsettings.json
中的。
接下来在 Configure
方法中使用限流中间件。
public class Startup{// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseIpRateLimiting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
最后再来看一下 appsettings.json 文件,着重看一下 限流规则 是怎么配置的,可以看出一个限流规则是由 端点 + 周期 + 次数
3个元素组成的,完整的 appsettings.json 配置如下:
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","IpRateLimit": {"EnableEndpointRateLimiting": true,"StackBlockedRequests": false,"RealIPHeader": "X-Real-IP","ClientIdHeader": "X-ClientId","HttpStatusCode": 429,"GeneralRules": [{"Endpoint": "*/weatherforecast","Period": "1m","Limit": 5}]}
}
上面的限流规则可以确保:含有 "/api" 的 url 链接在任何分钟周期内最多有5次访问。
测试 AspNetCoreRateLimit
下面就可以按下 Ctrl + F5 把应用程序跑起来,默认情况下请求会访问 ValueController 的 Get 方法,然后刷新页面5次,会看到页面出现如下信息。
因为是演示目的,所以这里我配置成了5次,实际开发中,大家可以根据项目的具体情况来设置这个限流阈值,当然更灵活的做法就是将 限流次数 保存在 数据库 或者缓存中,这样可以在程序运行过程中动态的修改这个阈值,太强大了。
如何在 Asp.Net Core 中对请求进行限流相关推荐
- ASP.NET Core中使用滑动窗口限流
滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更精确的应对流量变化,比较著名的应用场景就是TCP协议的流量控制,不过今天要说的是服务限流场景中的应用. 算法原理 这里假设业务需要每秒钟限流 ...
- ASP.NET Core中使用令牌桶限流
在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量. 比如限流每秒100次请求,绝大多数的时间里都不会超过这个数,但是偶尔某 ...
- 如何在 ASP.NET Core 中使用 HttpClientFactory ?
ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...
- 如何在 ASP.Net Core 中使用 Lamar
ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...
- 如何在 ASP.NET Core 中使用 URL Rewriting 中间件
URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...
- 如何在ASP.NET Core中使用Azure Service Bus Queue
原文:USING AZURE SERVICE BUS QUEUES WITH ASP.NET CORE SERVICES 作者:damienbod[1] 译文:如何在ASP.NET Core中使用Az ...
- 如何在ASP.NET Core中使用JSON Patch
原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...
- asp英语是什么意思_如何在ASP.NET Core中使用JSON Patch
原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...
- 如何在 ASP.Net Core 中使用 Autofac
依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...
最新文章
- 【bzoj2724】[Violet 6]蒲公英 分块+STL-vector
- php gd 缩略图,[PHP GD库]①0--缩略图封装
- VTK:可视化算法之SpikeFran
- MyEclipse 2015优化技巧
- 基于php的购物网站源代码,基于PHP的网上商城购物网站设计(含源文件).doc
- iis php环境安装包下载,php5 环境集成安装包 for IIS6
- html设置抽奖概率,js设置概率随机数(可用于抽奖,砍价的逻辑应用)
- android换手机通讯录,技巧:要换新手机了 通讯录如何搬家?
- Golang复杂json结构体解析
- 【已解决】ubuntu无法进入启动页面,全屏出现【ok】并且不停闪烁
- 【原创】/Restarting/ Splay树 (普通平衡树 文艺平衡树 bzoj1895 poj 2580 SuperMemo 题解)
- mfc匹配关键字颜色显示_如何在多台显示器上匹配颜色
- 将阿拉伯数字转为中文数字读法
- 数据分析系列 之3σ规则/依据拉依达准则来剔除异常值
- 传输层协议TCP和UDP的区别详解
- 嵌入式系统设计(一)
- 信息学奥赛一本通-1047
- fitbit同步不了怎么解决_怎么处理Fitbit 后台同步错误信息?
- Centos中安装kenlm
- 《Small Memory Software:Patterns For System With Limited Memory》读书笔记
热门文章
- MyBatis缓存通俗易懂
- 【重大更新】DevExpress v17.2新版亮点—Bootstrap篇(二)
- 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
- shell 用环境变量的值修改properties文件
- php自动生成mysql的触发代码。
- Technical User Stories – What, When, and How?
- VHDL 整数 小数 分数 分频
- 财税、管理知识,离您那么远吗?
- github的使用教程
- Codeigniter中创建LeanCloud云函数实现微信支付