翼度科技»论坛 编程开发 .net 查看内容

基于 ActionFilters 的限流库DotNetRateLimiter使用

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
前言

在构建API项目时,有时出于安全考虑,防止访问用户恶意攻击,希望限制此用户ip地址的请求次数,减轻拒绝服务攻击可能性,也称作限流。接下来,我们就来学习开源库DotNetRateLimiter 如何轻松实现限流。
项目使用配置

安装Nuget包

在新建立的WebAPI项目中,通过Nuget包管理器安装DotNetRateLimiter,安装命令:
NuGet\Install-Package DotNetRateLimiter -Version 1.0.7
项目服务注入
  1. using DotNet.RateLimiter;
  2. var builder = WebApplication.CreateBuilder(args);
  3. //DotNetRateLimiter配置
  4. builder.Services.AddRateLimitService(builder.Configuration);
复制代码
DotNetRateLimiter 配置:

appsetting.json 文件中,添加JSON对象节点进行配置,如下:
  1. "RateLimitOption": {
  2.     "EnableRateLimit": true, //是否开启
  3.     "HttpStatusCode": 429,//http响应码
  4.     "ErrorMessage": "请求次数过多", //响应信息
  5.     "IpHeaderName": "X-Forwarded-For",//客户端IP请求头
  6.     //"RedisConnection": "127.0.0.1:6379",  默认使用内存缓存,并且支持配置 Redis 连接, 这样可以对分布式应用进行限流。
  7.     "IpWhiteList": ["::1"], //设置白名单集合
  8.     "ClientIdentifier": "X-Client-Id"   
  9.   }
复制代码
到此配置已经完成,非常简单,接下就是在项目中如何进行使用。
项目中使用

控制器Controller上使用

这个控制器20秒内只允许 3 个请求, 如果调用 api 超过 3 次,就会收到http错误请求代码: 429,错误信息:请求次数过多
  1.     [Route("api/[controller]")]
  2.     [ApiController]
  3.     [RateLimit(PeriodInSec = 20, Limit = 3, Scope = RateLimitScope.Controller)]//控制器上使用
  4.     public class RateLimiterController : ControllerBase
  5.     {
  6.         
  7.     }
复制代码
接口Action上使用

这个接口20秒内只允许 3 个请求, 如果调用 api 超过 3 次,就会收到http错误请求代码: 429,错误信息:请求次数过多
  1. /// <summary>
  2.         ///  添加RateLimit接口特性
  3.         /// </summary>
  4.         /// <returns></returns>
  5.         [HttpGet]
  6.         [Route("GetNow")]
  7.         [RateLimit(PeriodInSec = 20, Limit = 3)]
  8.         public ActionResult GetNow()
  9.         {
  10.             return Ok(
  11.                 new
  12.                 {
  13.                     Msg = "当前时间",
  14.                     Value = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
  15.                 }
  16.                 );
  17.         }
  18.         /// <summary>
  19.         /// 不添加RateLimit特性接口
  20.         /// </summary>
  21.         /// <returns></returns>
  22.         [HttpGet]
  23.         [Route("GetYesteyDayNow")]
  24.         public ActionResult GetYesteyDayNow()
  25.         {
  26.             return Ok(
  27.                new
  28.                {
  29.                    Msg = "昨天时间",
  30.                    Value = DateTime.Now.AddDays(-1).ToString("yyyy/MM/dd HH:mm:ss")
  31.         }
  32.                );
  33.         }
  34.         /// <summary>
  35.         /// RateLimit特性结合路由参数接口
  36.         /// </summary>
  37.         /// <param name="day"></param>
  38.         /// <returns></returns>
  39.         [HttpGet]
  40.         [Route("GetBeforeTimeByDay/{day}")]
  41.         [RateLimit(PeriodInSec = 20, Limit = 3, RouteParams = "day")]//搭配路由进行使用
  42.         public ActionResult ActionResult(int day)
  43.         {
  44.             return Ok(
  45.              new
  46.              {
  47.                  Msg = $"{day}天前时间",
  48.                  Value = DateTime.Now.AddDays(-day).ToString("yyyy/MM/dd HH:mm:ss")
  49.         }
  50.              );
  51.         }
复制代码
测试验证

打开Swagger,调用接口测试:


源码获取

关注公众号,后台回复关键字:RateLimiter

来源:https://www.cnblogs.com/wml-it/archive/2023/09/18/17709144.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具