You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET带分区键与队列限制的Rate Limit API异常问题排查

问题分析与解决方案

初始问题:不同用户并发调用返回429

原因是中间件顺序错误:最初将UseRateLimiter()放在UseRouting()之后、认证授权中间件之前,此时httpContext.User.Identity还未完成初始化,所有请求都会使用httpContext.Request.GetIpAddress()作为分区键。如果不同用户共用同一IP(比如同一局域网环境),就会被归到同一个限流分区,触发并发限制返回429。

调整中间件后的问题:请求被阻塞排队

调整为UseAuthentication()→UseAuthorization()→UseRateLimiter()后,分区键能正确获取用户名,但出现的排队现象是浏览器的同源请求并发限制导致,而非ASP.NET限流组件的问题:

  • 主流浏览器(如Chrome)对同一域名的同类型请求有默认并发数限制(通常为6个),且针对同一用户的同接口请求,浏览器会自动排队逐个发送,不会真正并发发起。
  • 断点仅触发一次的原因是:RateLimitPartition.GetConcurrencyLimiter()的工厂方法是懒加载的,同一分区(同一用户名/IP)的第一个请求会创建限流器实例,后续请求直接复用该实例,不会再进入工厂方法,因此断点只在首次请求时触发。

解决步骤

  1. 确认中间件顺序:必须保证限流中间件在认证授权之后,确保能正确获取用户身份作为分区键:

    app.UseAuthentication();
    app.UseAuthorization();
    app.UseRateLimiter();
    
  2. 绕过浏览器并发限制验证:

    • 使用Postman、curl等API测试工具,模拟不同用户(携带不同身份令牌)并发发送请求,避免浏览器的自动排队行为。
    • 或使用不同浏览器、隐身窗口分别模拟不同用户,同时发起请求。
  3. 验证限流规则:
    在MyApi接口中添加延迟,模拟业务处理耗时:

    [Authorize]
    [EnableRateLimiting(GexRateLimitingPolicies.Concurrent)]
    public async Task<IActionResult> MyApi()
    {
        await Task.Delay(3000); // 模拟3秒处理时间
        return Ok("Success");
    }
    
    • 同一用户同时发送2个请求:第二个请求会立即返回429。
    • 不同用户同时发送请求:两个请求都会正常处理,不会触发429。

内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:03:26