经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
基于 ActionFilters 的限流库DotNetRateLimiter使用
来源:cnblogs  作者:码农阿亮  时间:2023/9/18 9:02:32  对本文有异议

前言

在构建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. }
接口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,调用接口测试:

image

image

源码获取

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

原文链接:https://www.cnblogs.com/wml-it/p/17709144.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号