开始使用速率限制中间件在ASP。网络核心7

利用新的利率限制中间件在ASP。网络核心7to protect against malicious attacks on your applications and ensure equitable use of server resources.

  • 在Facebook上分享
  • 在Twitter上分享
  • 分享在LinkedIn
  • 在Reddit分享
  • 通过电子邮件分享
  • 印刷资源
等待签署
皮特•史密斯(CC0)

速度限制技术用来限制允许特定资源的请求数阻止DDoS攻击和API的虐待。一旦达到极限速度阈值,后续请求的资源是不允许推迟,或压制。

在ASP。net 7之前,实施速度限制。净AspNetCoreRateLimit等核心应用程序需要使用第三方包。但与ASP。网络核心7,rate limiting is now a built-in feature, available as a middleware designed to prevent abuse, protect against attacks, and ensure fair resource allocation.

我讨论了如何使用AspNetCoreRateLimit在早期版本的ASP实现率限制。网络的核心前一篇文章。在本文中,我们将研究如何使用新的内置速度限制了中间件在ASP。网络核心7。

使用本文中提供的代码示例,您应该Visual Studio 2022安装在您的系统。如果你不已经有一个副本,你可以在这里下载Visual Studio 2022

创建一个ASP。网络核心7Web API project in Visual Studio 2022

首先,让我们创建一个ASP。网络核心7project in Visual Studio 2022. Follow these steps:

  1. 启动Visual Studio 2022 IDE。
  2. 点击“创建新项目。”
  3. 在“创建新项目”窗口中,选择“ASP。网络核心Web API”从模板列表中显示出来。
  4. 单击Next。
  5. 在“配置您的新项目”窗口中,指定新项目的名称和位置。
  6. (可选)检查“解决方案和项目在同一个目录”复选框,根据您的喜好。
  7. 单击Next。
  8. 下所示的“其他信息”窗口中,把“使用控制器(取消使用最少的api)”复选框,因为我们不会在这个项目中使用最少的api。离开“验证类型”设置为“无”(默认)。
  9. 确保复选框“启用开放API支持,”“为HTTPS,配置”和“使码头工人”没有在这里我们不会使用这些功能。
  10. 单击Create。

我们将使用ASP。网络核心7Web API project to work with built-in rate limiting middleware in the sections below.

内置速度限制在ASP。网络核心7

速度限制在ASP。网络核心7is available as part of the System.Threading.RateLimiting namespace. The main type is the abstract base class RateLimiter, which has several amazing features.

RateLimiter可以配置几个选项包括允许的最大请求数、响应状态码,和时间窗口。您可以定义的速率限制根据HTTP方法,客户端IP地址,和其他因素。你甚至可以选择排队的请求,而不是排斥它们。

支持以下速度限幅算法:

  • 固定窗
  • 滑动窗口
  • 令牌桶
  • 并发性

添加率限制中间件ASP。网络核心7application, you should first add the required services to the container as shown in the code snippet given below.

builder.Services。AddRateLimiter(选项= >{/ /编写代码配置中间件在这里});

中间件添加到管道,应该调用UseRateLimiter扩展方法如下所示。

app.UseRateLimiter ();

速率限制配置中间件在ASP。网络核心7

现在,编写下面的代码的程序。cs文件配置速度限制器。

builder.Services。AddRateLimiter(选项= >{选项。GlobalLimiter = PartitionedRateLimiter。创建< HttpContext,字符串> (HttpContext = > {RateLimitPartition返回。GetFixedWindowLimiter (partitionKey: httpContext.Request.Headers.Host.ToString(),分区= >新FixedWindowRateLimiterOptions {PermitLimit = 5, AutoReplenishment = true,窗口= TimeSpan.FromSeconds (10)});});});

调用AddRateLimiter方法注册的中间件服务集合。这个示例使用GlobalLimiter所有请求,这GlobalLimiter PartitionedRateLimiter设置。

然后用来补充FixedWindowLimiter允许请求。请注意,当您运行应用程序和调用端点超过允许极限,HTTP状态代码503将返回“服务不可用”。

或者,您可以配置中间件返回的HTTP状态码429“太多的请求。“这样做,使用下面的代码片段。

选项。OnRejected =异步(上下文令牌)= > {context.HttpContext.Response。StatusCode = 429;等待Task.CompletedTask;};

如果你想自定义错误消息,您可以使用下面的代码片段。

选项。OnRejected =异步(上下文令牌)= > {context.HttpContext.Response。StatusCode = 429;等待Task.CompletedTask;};

完成速度限制(程序示例。cs源)

这是程序的完整源代码。cs文件供你参考。

使用System.Threading.RateLimiting;var builder = WebApplication.CreateBuilder (args);/ /服务添加到容器中。builder.Services.AddControllers ();builder.Services。AddRateLimiter(选项= >{选项。GlobalLimiter = PartitionedRateLimiter。创建< HttpContext,字符串> (HttpContext = > {RateLimitPartition返回。GetFixedWindowLimiter (partitionKey: httpContext.Request.Headers.Host.ToString(),分区= >新FixedWindowRateLimiterOptions {PermitLimit = 5, AutoReplenishment = true,窗口= TimeSpan.FromSeconds (10)});}); options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 429; await context.HttpContext.Response.WriteAsync("Too many requests. Please try later again... ", cancellationToken: token); }; }); var app = builder.Build(); app.UseRateLimiter(); // Configure the HTTP request pipeline. app.UseAuthorization(); app.MapControllers(); app.Run();

队列的请求,而不是排斥它们

你也可以队列的请求,而不是排斥它们。要做到这一点,你应该利用QueueLimit属性和设置你想要的值,如下面代码片段所示。

builder.Services。AddRateLimiter(选项= >{选项。GlobalLimiter = PartitionedRateLimiter。创建< HttpContext,字符串> (HttpContext = > {RateLimitPartition返回。GetFixedWindowLimiter (partitionKey: httpContext.Request.Headers.Host.ToString(),分区= >新FixedWindowRateLimiterOptions {PermitLimit = 5, AutoReplenishment = true, QueueLimit = 5, QueueProcessingOrder = QueueProcessingOrder。OldestFirst窗口= TimeSpan.FromSeconds (10)});});选项。OnRejected =异步(上下文令牌)= > {context.HttpContext.Response。StatusCode = 429;等待context.HttpContext.Response。WriteAsync(“太多的请求。请尝试稍后再… ", cancellationToken: token); }; });

注意QueueProcessingOrder OldestFirst已设置。如果你想过去处理队列中插入项第一,您可以设置QueueProcessingOrder NewestFirst。

通过使用利率限制,您可以减少服务器的负载,并保护其免受糟糕的演员,确保您的服务的可用性和公平使用可用的资源。在速度限制在未来的文章中,我将讨论不同的速率限制算法可在ASP。净核心7和如何实现自定义的速率限制政策。

版权©2023 IDG通信公司。

奖2023年信息世界的技术。现在打开条目!