TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码
/
注册
用户名
邮箱

如何在ASP.NETCore中实现速率限制

2025-06-10
/
0 评论
/
5 阅读
/
正在检测是否收录...
06/10

如何在ASP.NET Core中实现速率限制

在开发Web应用程序时,特别是面向公众的网站或API时,实现速率限制(Rate Limiting)是一个至关重要的安全措施。它可以帮助防止恶意用户或机器通过大量请求导致服务过载、资源耗尽或数据泄露。在ASP.NET Core中,我们可以通过多种方式实现速率限制,以下将介绍一种通用的方法,即统一按请求的标题(Title)、关键词(Keywords)、描述(Description)和正文(Body)进行速率限制。

1. 引入必要的NuGet包

首先,确保你的项目中安装了Microsoft.Extensions.PrimitivesPolly这两个NuGet包。Polly是一个功能强大的.NET库,用于容错、重试、超时、故障隔离和速率限制等。

bash dotnet add package Microsoft.Extensions.Primitives dotnet add package Polly

2. 定义速率限制策略

创建一个新的类RateLimitingPolicy,在其中定义一个静态的IAsyncPolicy<T>,用于对标题、关键词、描述和正文进行速率限制。我们将使用Polly的BulkheadBlockRateLimitBucket来达到这个目的。

```csharp
using Polly;
using System;
using System.Threading;
using System.Threading.Tasks;

public class RateLimitingPolicy
{
private static readonly AsyncPolicy _rateLimitPolicy = Policy.Handle()
.OrResult(r => r is RequestException) // 捕捉由Polly创建的异常类型
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), onRetry: (context, ts, r, ctx) => { }) // 3次重试策略,每次间隔翻倍
.WrapAsync(Policy.TimeoutAsync(TimeSpan.FromSeconds(10), onTimeoutAsync: (context, ex) => { }, onTimeoutRejected: (context, ex) => { })); // 超时策略

public static async Task<object> ApplyRateLimitAsync(string title, string keywords, string description, string body, CancellationToken cancellationToken)
{
    var combinedKey = $"{title}_{keywords}_{description}_{body}"; // 组合成一个简单的键值来唯一标识一个请求
    var result = await _rateLimitPolicy.ExecuteAsync(async (ctx, ct) => {
        var semaphore = new SemaphoreSlim(1, 1); // 创建信号量,限流一个单位时间内只有一个请求通过
        await semaphore.WaitAsync(ct); // 等待信号量释放
        try {
            // 模拟处理请求逻辑,实际项目中这里应包含你的业务逻辑处理代码
            await Task.Delay(100, ct); // 模拟处理时间,实际中应该是处理业务逻辑的时间
            return new { Success = true }; // 返回处理结果
        } finally {
            semaphore.Release(); // 请求处理完成,释放信号量以便其他请求可以进入
        }
    }, cancellationToken);
    return result;
}

}
```
在这个示例中,我们使用了一个简单的信号量(SemaphoreSlim)作为基础的限流机制。每次请求都会尝试获取这个信号量,如果信号量不可用(即达到了我们设定的速率限制),则请求将被阻塞直至下一个周期。通过组合标题、关键词、描述和正文来生成一个唯一的键值,以实现更精细的速率控制。同时,利用WaitAndRetryAsyncTimeoutAsync来处理可能的重试和超时情况。

3. 在API或控制器中使用速率限制策略

现在你可以在ASP.NET Core的控制器或API中注入这个策略,并使用它来保护你的接口了。假设你有一个接收POST请求的API:

```csharp
using Microsoft.AspnetCore.Mvc;
using System.Threading;
using System.Threading.Tasks;
using System.Net; // 为了返回HTTP状态码429(Too Many Requests)
using Polly; // 引入Polly命名空间以使用Polly策略功能
using YourNamespace.RateLimitingPolicy; // 引用你的RateLimitingPolicy类所在的命名空间路径

[ApiController]
[Route("[controller]")]
public class YourController : ControllerBase {
[HttpPost]
public async Task YourMethod(string title, string keywords, string description, string body) {
try {
var result = await RateLimitingPolicy.ApplyRateLimitAsync(title, keywords, description, body, CancellationToken.None); // 调用速率限制策略函数进行异步处理
return Ok(result); // 返回成功响应或自定义的响应内容
} catch (RequestException) { // Polly的异常类型处理你的异常逻辑,如记录日志等操作... } catch (Exception ex) { // 其他所有未捕获的异常... } finally { } // 最后完成时的逻辑... } } } // 返回HTTP状态码429或自定义错误信息给客户端。

朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/29339/(转载时请注明本文出处及文章链接)

评论 (0)