基于 ActionFilters 的限流库DotNetRateLimiter使用

news/发布时间2024/5/10 19:12:30

前言

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

项目使用配置

安装Nuget包

在新建立的WebAPI项目中,通过Nuget包管理器安装DotNetRateLimiter,安装命令:

NuGet\Install-Package DotNetRateLimiter -Version 1.0.7

项目服务注入
using DotNet.RateLimiter;var builder = WebApplication.CreateBuilder(args);
//DotNetRateLimiter配置
builder.Services.AddRateLimitService(builder.Configuration);
DotNetRateLimiter 配置:

appsetting.json 文件中,添加JSON对象节点进行配置,如下:

"RateLimitOption": {"EnableRateLimit": true, //是否开启"HttpStatusCode": 429,//http响应码"ErrorMessage": "请求次数过多", //响应信息"IpHeaderName": "X-Forwarded-For",//客户端IP请求头//"RedisConnection": "127.0.0.1:6379",  默认使用内存缓存,并且支持配置 Redis 连接, 这样可以对分布式应用进行限流。"IpWhiteList": ["::1"], //设置白名单集合"ClientIdentifier": "X-Client-Id"    }

到此配置已经完成,非常简单,接下就是在项目中如何进行使用。

项目中使用

控制器Controller上使用

这个控制器20秒内只允许 3 个请求, 如果调用 api 超过 3 次,就会收到http错误请求代码: 429,错误信息:请求次数过多

    [Route("api/[controller]")][ApiController][RateLimit(PeriodInSec = 20, Limit = 3, Scope = RateLimitScope.Controller)]//控制器上使用public class RateLimiterController : ControllerBase{}
接口Action上使用

这个接口20秒内只允许 3 个请求, 如果调用 api 超过 3 次,就会收到http错误请求代码: 429,错误信息:请求次数过多

 /// <summary>///  添加RateLimit接口特性/// </summary>/// <returns></returns>[HttpGet][Route("GetNow")][RateLimit(PeriodInSec = 20, Limit = 3)]public ActionResult GetNow(){return Ok(new{Msg = "当前时间",Value = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")});}/// <summary>/// 不添加RateLimit特性接口/// </summary>/// <returns></returns>[HttpGet][Route("GetYesteyDayNow")]public ActionResult GetYesteyDayNow(){return Ok(new{Msg = "昨天时间",Value = DateTime.Now.AddDays(-1).ToString("yyyy/MM/dd HH:mm:ss")});}/// <summary>/// RateLimit特性结合路由参数接口/// </summary>/// <param name="day"></param>/// <returns></returns>[HttpGet][Route("GetBeforeTimeByDay/{day}")][RateLimit(PeriodInSec = 20, Limit = 3, RouteParams = "day")]//搭配路由进行使用public ActionResult ActionResult(int day){return Ok(new{Msg = $"{day}天前时间",Value = DateTime.Now.AddDays(-day).ToString("yyyy/MM/dd HH:mm:ss")});}

测试验证

打开Swagger,调用接口测试:

image

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/24868768.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

ES 2023新特性速解

ES 2023新特性速解 一、新增数组方法 操作数组的方法 Array.prototype.toSorted(compareFn) //返回一个新数组,其中元素按升序排序,而不改变原始数组。 Array.prototype.toReversed() //返回一个新数组,该数组的元素顺序被反转,但不改变原始数组。 Array.prototype.toSpli…

【译】通过自动反编译和外部源提升调试

Visual Studio 支持外部源代码调试和反编译已经有一段时间了。然而,随着 Visual Studio 17.7的发布,调试器有了一个重大的飞跃,它为 .NET 库引入了自动反编译功能,使得 Visual Studio 中的外部代码调试变得更加流畅和轻松。它集成了反编译器,可以实时反编译外部代码,并根…

学信息系统项目管理师第4版系列09_配置管理

学信息系统项目管理师第4版系列09_配置管理1. 配置管理 1.1. 应用技术的和管理的指导和监控方法以标识和说明配置项的功能和物理特征,控制这些特征的变更,记录和报告变更处理和实现状态并验证与规定的需求的遵循性 1.1.1. GB/T 11457《信息技术软件工程术语》 2. 配置项 2.1.…

Windows 安装 chromedriver 和 Python 调试

下载 chromedriver 从官方网站上下载 chromedriver 的版本,这个版本需要和你 Chrome 的版本对应上。 下载的地址为:ChromeDriver - WebDriver for Chrome - Downloads这个地方,将会打开一个新的浏览器界面,Chrome for Testing availability 在这个新的浏览器界面中,我们能…

Chromedriver 在 Python 中查看源代码的方法

Python 中可以属性来查看需要爬取的网站的源代码。 对应具体的是:chrome.page_source需要注意的是首先需要导入包 from selenium.webdriver import Chrome 然后进行初始化:chrome = Chrome(service=Service(r"C:\Users\yhu\Downloads\chromedriver-win64\chromedriver-w…

Maven03-Maven使用入门

1、创建Maven项目的目录结构为maven-project01项目创建目录结构。首先创建一个名为maven-project01的文件夹,并在其下创建如下目录。2、编写pom.xmlMaven项目的核心是pom.xml,就像Make的Makefile,Ant的build.xml一样。 POM(Project Object Model,项目对象模型)定义了项目的…