译文链接: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 中对请求进行限流相关推荐

  1. ASP.NET Core中使用滑动窗口限流

    滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更精确的应对流量变化,比较著名的应用场景就是TCP协议的流量控制,不过今天要说的是服务限流场景中的应用. 算法原理 这里假设业务需要每秒钟限流 ...

  2. ASP.NET Core中使用令牌桶限流

    在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量. 比如限流每秒100次请求,绝大多数的时间里都不会超过这个数,但是偶尔某 ...

  3. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  4. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  5. 如何在 ASP.NET Core 中使用 URL Rewriting 中间件

    URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...

  6. 如何在ASP.NET Core中使用Azure Service Bus Queue

    原文:USING AZURE SERVICE BUS QUEUES WITH ASP.NET CORE SERVICES 作者:damienbod[1] 译文:如何在ASP.NET Core中使用Az ...

  7. 如何在ASP.NET Core中使用JSON Patch

    原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...

  8. asp英语是什么意思_如何在ASP.NET Core中使用JSON Patch

    原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...

  9. 如何在 ASP.Net Core 中使用 Autofac

    依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...

最新文章

  1. 【bzoj2724】[Violet 6]蒲公英 分块+STL-vector
  2. php gd 缩略图,[PHP GD库]①0--缩略图封装
  3. VTK:可视化算法之SpikeFran
  4. MyEclipse 2015优化技巧
  5. 基于php的购物网站源代码,基于PHP的网上商城购物网站设计(含源文件).doc
  6. iis php环境安装包下载,php5 环境集成安装包 for IIS6
  7. html设置抽奖概率,js设置概率随机数(可用于抽奖,砍价的逻辑应用)
  8. android换手机通讯录,技巧:要换新手机了 通讯录如何搬家?
  9. Golang复杂json结构体解析
  10. 【已解决】ubuntu无法进入启动页面,全屏出现【ok】并且不停闪烁
  11. 【原创】/Restarting/ Splay树 (普通平衡树 文艺平衡树 bzoj1895 poj 2580 SuperMemo 题解)
  12. mfc匹配关键字颜色显示_如何在多台显示器上匹配颜色
  13. 将阿拉伯数字转为中文数字读法
  14. 数据分析系列 之3σ规则/依据拉依达准则来剔除异常值
  15. 传输层协议TCP和UDP的区别详解
  16. 嵌入式系统设计(一)
  17. 信息学奥赛一本通-1047
  18. fitbit同步不了怎么解决_怎么处理Fitbit 后台同步错误信息?
  19. Centos中安装kenlm
  20. 《Small Memory Software:Patterns For System With Limited Memory》读书笔记

热门文章

  1. MyBatis缓存通俗易懂
  2. 【重大更新】DevExpress v17.2新版亮点—Bootstrap篇(二)
  3. 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
  4. shell 用环境变量的值修改properties文件
  5. php自动生成mysql的触发代码。
  6. Technical User Stories – What, When, and How?
  7. VHDL 整数 小数 分数 分频
  8. 财税、管理知识,离您那么远吗?
  9. github的使用教程
  10. Codeigniter中创建LeanCloud云函数实现微信支付