超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

如何在 ASP.NET Core 中實(shí)現(xiàn)速率限制?

freeflydom
2025年1月16日 11:2 本文熱度 391

在 ASP.NET Core 中實(shí)現(xiàn)速率限制(Rate Limiting)中間件可以幫助你控制客戶端對(duì) API 的請(qǐng)求頻率,防止濫用和過(guò)載。速率限制通常用于保護(hù)服務(wù)器資源,確保服務(wù)的穩(wěn)定性和可用性。

ASP.NET Core 本身并沒(méi)有內(nèi)置的速率限制中間件,但你可以通過(guò)自定義中間件或使用第三方庫(kù)來(lái)實(shí)現(xiàn)速率限制。以下是實(shí)現(xiàn)速率限制的幾種常見方法:


1. 使用自定義中間件實(shí)現(xiàn)速率限制

你可以通過(guò)自定義中間件來(lái)實(shí)現(xiàn)速率限制。以下是一個(gè)簡(jiǎn)單的實(shí)現(xiàn)示例:

1.1 實(shí)現(xiàn)速率限制中間件

using Microsoft.AspNetCore.Http;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public class RateLimitingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly int _maxRequests; // 每分鐘允許的最大請(qǐng)求數(shù)
    private readonly ConcurrentDictionary<string, RateLimiter> _rateLimiters;
    public RateLimitingMiddleware(RequestDelegate next, int maxRequests)
    {
        _next = next;
        _maxRequests = maxRequests;
        _rateLimiters = new ConcurrentDictionary<string, RateLimiter>();
    }
    public async Task InvokeAsync(HttpContext context)
    {
        // 獲取客戶端的唯一標(biāo)識(shí)(例如 IP 地址)
        var clientId = context.Connection.RemoteIpAddress.ToString();
        // 獲取或創(chuàng)建速率限制器
        var rateLimiter = _rateLimiters.GetOrAdd(clientId, _ => new RateLimiter(_maxRequests));
        if (rateLimiter.AllowRequest())
        {
            await _next(context);
        }
        else
        {
            context.Response.StatusCode = StatusCodes.Status429TooManyRequests;
            await context.Response.WriteAsync("請(qǐng)求太多。請(qǐng)稍后再試.");
        }
    }
}
public class RateLimiter
{
    private readonly int _maxRequests;
    private int _requestCount;
    private DateTime _windowStart;
    public RateLimiter(int maxRequests)
    {
        _maxRequests = maxRequests;
        _requestCount = 0;
        _windowStart = DateTime.UtcNow;
    }
    public bool AllowRequest()
    {
        var now = DateTime.UtcNow;
        // 如果當(dāng)前時(shí)間窗口已過(guò)期,重置計(jì)數(shù)器
        if ((now - _windowStart).TotalSeconds > 60)
        {
            _requestCount = 0;
            _windowStart = now;
        }
        // 檢查請(qǐng)求是否超出限制
        if (_requestCount < _maxRequests)
        {
            _requestCount++;
            return true;
        }
        return false;
    }
}

1.2 注冊(cè)中間件

在 Startup.cs 中注冊(cè)中間件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseMiddleware<RateLimitingMiddleware>(10); // 每分鐘最多 10個(gè)請(qǐng)求
    app.UseRouting();
    app.UseEndpoints(endpoints =>
                     {
                         endpoints.MapControllers();
                     });
}

2. 使用第三方庫(kù)實(shí)現(xiàn)速率限制

如果你不想自己實(shí)現(xiàn)速率限制邏輯,可以使用一些現(xiàn)成的第三方庫(kù),例如:

2.1 AspNetCoreRateLimit

AspNetCoreRateLimit 是一個(gè)流行的 ASP.NET Core 速率限制庫(kù),支持 IP 地址、客戶端 ID 和端點(diǎn)級(jí)別的速率限制。

安裝

通過(guò) NuGet 安裝:

dotnet add package AspNetCoreRateLimit
配置

在 Startup.cs 中配置速率限制:

public void ConfigureServices(IServiceCollection services)
{
    // 添加內(nèi)存緩存
    services.AddMemoryCache();
    // 配置速率限制
    services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
    services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
    services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
    services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
    services.AddSingleton<IProcessingStrategy, AsyncKeyLockProcessingStrategy>();
    services.AddInMemoryRateLimiting();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseIpRateLimiting();
    app.UseRouting();
    app.UseEndpoints(endpoints =>
                     {
                         endpoints.MapControllers();
                     });
}
配置文件

在 appsettings.json 中添加速率限制配置:

{
    "IpRateLimiting": {
        "EnableEndpointRateLimiting": true,
        "StackBlockedRequests": false,
        "RealIpHeader": "X-Real-IP",
        "ClientIdHeader": "X-ClientId",
        "GeneralRules": [
            {
                "Endpoint": "*",
                "Period": "1m",
                "Limit": 10
                }
        ]
    }
}

3. 使用分布式緩存實(shí)現(xiàn)速率限制

如果你的應(yīng)用是分布式的(例如部署在 Kubernetes 或多個(gè)服務(wù)器上),可以使用分布式緩存(如 Redis)來(lái)實(shí)現(xiàn)速率限制。

3.1 使用 Redis 實(shí)現(xiàn)速率限制

你可以使用 Redis 來(lái)存儲(chǔ)每個(gè)客戶端的請(qǐng)求計(jì)數(shù)。以下是一個(gè)簡(jiǎn)單的示例:

using Microsoft.AspNetCore.Http;
using StackExchange.Redis;
using System.Threading.Tasks;
public class RedisRateLimitingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly int _maxRequests;
    private readonly ConnectionMultiplexer _redis;
    public RedisRateLimitingMiddleware(RequestDelegate next, int maxRequests, ConnectionMultiplexer redis)
    {
        _next = next;
        _maxRequests = maxRequests;
        _redis = redis;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        var clientId = context.Connection.RemoteIpAddress.ToString();
        var db = _redis.GetDatabase();
        var key = $"rate_limit:{clientId}";
        var requestCount = await db.StringIncrementAsync(key);
        if (requestCount == 1)
        {
            await db.KeyExpireAsync(key, TimeSpan.FromMinutes(1));
        }
        if (requestCount > _maxRequests)
        {
            context.Response.StatusCode = StatusCodes.Status429TooManyRequests;
            await context.Response.WriteAsync("請(qǐng)求太多。請(qǐng)稍后再試.");
        }
        else
        {
            await _next(context);
        }
    }
}

3.2 注冊(cè)中間件

在 Startup.cs 中注冊(cè)中間件:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ConnectionMultiplexer>(ConnectionMultiplexer.Connect("localhost:6379"));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseMiddleware<RedisRateLimitingMiddleware>(10); // 每分鐘最多 10個(gè)請(qǐng)求
    app.UseRouting();
    app.UseEndpoints(endpoints =>
                     {
                         endpoints.MapControllers();
                     });
}

4. 總結(jié)

在 ASP.NET Core 中實(shí)現(xiàn)速率限制有多種方式:

  • 自定義中間件:適合簡(jiǎn)單的場(chǎng)景,但需要自己實(shí)現(xiàn)邏輯。
  • 第三方庫(kù):如 AspNetCoreRateLimit,提供了更強(qiáng)大的功能和靈活性。
  • 分布式緩存:如 Redis,適合分布式環(huán)境。

根據(jù)你的需求選擇合適的方式,確保你的 API 能夠有效防止濫用和過(guò)載。

?轉(zhuǎn)自https://www.cnblogs.com/liyongqiang-cc/p/18628407


該文章在 2025/1/16 11:02:11 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved