首页 > 编程语言 >ASP.NET Core (.NET 7) 中的速率限制中间件

ASP.NET Core (.NET 7) 中的速率限制中间件

时间:2023-12-31 21:33:20浏览次数:32  
标签:Core 限制 请求 中间件 速率 窗口 NET

 

ASP.NET Core 中的速率限制中间件可以用于限制特定资源在一段时间内允许的请求次数。速率限制可以用于保护服务器资源,防止拒绝服务 (DoS) 攻击。Microsoft.AspNetCore.RateLimiting 或 AspNetCoreRateLimit 中间件提供速率限制中间件。 应用可配置速率限制策略,然后将策略附加到终结点。

1、速率限制器算法

在ASP.NET Core 中实现速率限制时,通常会使用特定的算法来决定何时以及如何限制请求。这些算法可以基于不同的标准,如IP地址、客户端ID或用户账号。

Microsoft.AspNetCore.RateLimiting 中间件用于限制速率,支持四种扩展方法。

1)固定窗口

AddFixedWindowLimiter 方法使用固定的时间窗口来限制请求。 当时间窗口过期时,会启动一个新的时间窗口,并重置请求限制

2)滑动窗口

与固定窗口限制器类似,但为每个窗口添加了段。 窗口在每个段间隔滑动一段。 段间隔的计算方式是:(窗口时间)/(每个窗口的段数)。

将窗口的请求数限制为 permitLimit 个请求。每个时间窗口划分为一个窗口 n 个段。从倒退一个窗口的过期时间段(当前段之前的 n 个段)获取的请求会添加到当前的段。 我们将倒退一个窗口最近过期时间段称为“过期的段”。

3)令牌桶

令牌桶限制器与滑动窗口限制器类似,但它不会结存从过期段获取的请求数,而是在每个补充期间添加固定数量的令牌。 每个段添加的令牌数不能使可用令牌数超过令牌桶限制。

4)并发

并发限制器会限制并发请求数。 每添加一个请求,在并发限制中减去 1。 一个请求完成时,在限制中增加 1。 其他请求限制器限制的是指定时间段的请求总数,而与它们不同,并发限制器仅限制并发请求数,不对一段时间内的请求数设置上限。

2、Microsoft.AspNetCore.RateLimiting

Microsoft.AspNetCore.RateLimiting 是微软官方提供的速率限制中间件,Microsoft.AspNetCore.RateLimiting 是 ASP.NET Core 中提供的内置速率限制包,它可以帮助控制应用程序中资源的访问频率,防止出现DoS攻击或过度消耗资源。它提供了基本的速率限制功能,适用于简单的场景。

使用示例:ASP.NET Core (.NET 7) 中的速率限制中间件

3、AspNetCoreRateLimit

AspNetCoreRateLimit 是一个第三方库,提供了一套丰富的速率限制功能。它支持IP限制和客户端ID限制策略。保护API免受过度使用和潜在的滥用。通过合理配置,可以有效地管理客户端的请求频率,确保服务的稳定性和可用性。可以存储在内存中,也可以配置为使用分布式存储(如Redis)来实现跨多个应用实例的速率限制。

1)安装引用 AspNetCoreRateLimit

在Nuget管理程序中,搜索 "AspNetCoreRateLimit",然后点击安装。

或者使用Package Manager命令安装 PM> Install-Package Serilog

注意:使用Redis,还需要安装AspNetCoreRateLimit.Redis包。

相关文档:VS(Visual Studio)中Nuget的使用

2)基于客户端IP速率限制

 使用示例:ASP.NET Core (.NET 7) 中的速率限制中间件

3)基于客户端ID速率限制

 使用示例:ASP.NET Core (.NET 7) 中的速率限制中间件

标签:Core,限制,请求,中间件,速率,窗口,NET
From: https://www.cnblogs.com/tinyblog/p/17938021

相关文章

  • Apache NetBeans IDE 20 输出中文乱码
    修改安装程文件夹下: C:\ProgramFiles\NetBeans-20\netbeans\etc下的 netbeans.conf第五十九行最后加上:  -J-Dfile.encoding=UTF-8 #LicensedtotheApacheSoftwareFoundation(ASF)underone#ormorecontributorlicenseagreements.SeetheNOTICEfile#d......
  • Neural Networks for Image Generation and Manipulation: A Creative Revolution
    1.背景介绍随着计算能力的不断提高和数据量的不断增加,深度学习技术在图像生成和处理领域取得了显著的进展。在这篇文章中,我们将深入探讨神经网络在图像生成和操纵方面的应用,以及它们如何引领一场创意革命。图像生成和操纵是计算机视觉领域的关键技术,它们在人工智能系统中扮演着至关......
  • GANs in the Wild: RealWorld Applications of Generative Adversarial Networks
    1.背景介绍生成对抗网络(GenerativeAdversarialNetworks,GANs)是一种深度学习算法,由伊戈尔·Goodfellow等人于2014年提出。这种算法通过两个神经网络来学习数据分布:一个生成器(Generator)和一个判别器(Discriminator)。生成器的目标是生成类似于训练数据的新数据,而判别器的目标是区分这......
  • GANs in Finance: Uncovering New Investment Opportunities with Generative Adversa
    1.背景介绍GenerativeAdversarialNetworks(GANs)havebeenahottopicinthefieldofdeeplearningandartificialintelligenceinrecentyears.Theyhaveshowngreatpotentialinvariousapplications,suchasimagesynthesis,dataaugmentation,andanomaly......
  • fsproj 相关 net481
    net481是.netframework4.8.1的标识名称,F#xunit默认下拉列表目标没有包含它,如果你必须测试net481,对于项目文件作如下修改:<PropertyGroup><!--<TargetFramework>net6.0</TargetFramework>--><TargetFramework>net481</TargetFramework></PropertyGroup......
  • ASP.NET Core 之路由相关
    ASP.NETCore中路由的过程:routingmiddleware把传入的url与一系列模板进行比对,选择相应的endpointhandler,并将其记录在HttpContext上的request上。endpointmiddleware执行选择的endpointhander,并返回response.在routingmiddleware之前的路由器并不知道传入的request对应的end......
  • Asp .Net Core 集成 FluentValidation 强类型验证规则库
    目录入门程序安装案例:登录验证器内置验证器自定义验证器编写自定义验证器可重复使用的属性验证器本地化DI自动验证官网:https://docs.fluentvalidation.net/en/latest/index.html入门程序安装使用VisualStudio中的NuGet包管理器控制台运行以下命令:Install-PackageFluent......
  • kubernetes部署gitlab
    1.部署镜像地址:ExploreDocker'sContainerImageRepository|DockerHubgithub地址:sameersbn/docker-gitlab:DockerizedGitLab(github.com)PostgreSQL:OmnibusGitLab附带的PostgreSQL版本|极狐GitLab环境变量介绍:sameersbn/docker-gitlab:DockerizedGitLab(gith......
  • Ftp基础(五):.NetCore中使用Ftp的建议(FluentFTP)
      上一篇说道C#使用FluentFTP来简单的连接使用Ftp,本篇是个人在.NetCore中使用Ftp的建议(可能有点啰嗦):  1、为Ftp的配置创建基类  在开发过程中,我们如果要使用Ftp,往往需要这几个信息:  Host:Ftp地址Port:端口号User:用户名Password:密码WorkingDirect......
  • ASP.NET Core MiniAPI中 EndPoint相关
    1.状态码返回之演化之路1.1最基本的就是用Results或者TypedResults返回带有状态码的响应(可选Json响应体)app.MapGet("/fruit/{id}",(stringid)=>{if(_fruit.TryGetValue(id,outFruitfruit)){returnResults.Ok(fruit)......