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

.NET 8 WebApi中IpRateLimiting特定端点规则不生效问题排查

.NET 8 WebApi IpRateLimiting 端点规则不生效问题解决

问题描述

在.NET 8 WebApi项目中配置IpRateLimiting限流,为*:/api/values端点设置了1秒内允许4次请求的规则,但系统始终执行全局的1秒3次请求限制,端点规则未生效。配置文件如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "IpRateLimitingSettings": {
    "EnableEndpointRateLimiting": true,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "GeneralRules": [
      {
        "Endpoint": "*:/api/values",
        "Period": "1s",
        "Limit": 4
      },
      {
        "Endpoint": "*",
        "Period": "1s",
        "Limit": 3
      }
    ]
  }
}

解决步骤

1. 确认NuGet包兼容性

确保安装适配.NET 8的AspNetCoreRateLimit包,建议使用最新稳定版(如AspNetCoreRateLimit.AspNetCore8),旧版本可能存在.NET 8路由匹配的兼容性问题。

2. 严格配置服务注册与中间件顺序

这是端点规则失效的核心诱因,必须按以下顺序配置:

服务注册(builder.Build()之前):

// 1. 添加内存缓存(限流计数依赖缓存存储)
builder.Services.AddMemoryCache();

// 2. 绑定IpRateLimiting配置节点
builder.Services.Configure<IpRateLimitOptions>(
    builder.Configuration.GetSection("IpRateLimitingSettings"));

// 3. 注册限流策略与计数器的内存存储实现
builder.Services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
builder.Services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

// 4. 添加Http上下文访问器(用于获取请求信息)
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

// 5. 注册IpRateLimiting核心服务
builder.Services.AddInMemoryRateLimiting();

// 6. 添加控制器服务
builder.Services.AddControllers();

中间件顺序(var app = builder.Build();之后):

// 1. 启用IpRateLimiting中间件(必须放在路由中间件之前)
app.UseIpRateLimiting();

// 2. 路由中间件
app.UseRouting();

// 3. 授权中间件
app.UseAuthorization();

// 4. 映射控制器端点
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

3. 调整端点规则匹配范围

  • 如果/api/values包含路由参数(如/api/values/{id}),需将规则中的Endpoint改为*:/api/values*以匹配所有子路径。
  • 确保请求路径与规则路径完全一致(默认规则匹配严格区分路径结构,可通过配置调整大小写敏感性)。

4. 重启服务生效配置

限流计数存储在内存缓存中,修改规则后必须重启服务,确保新规则覆盖旧缓存。

验证方法

使用Postman或curl对/api/values连续发送4次请求,第4次应返回200,第5次返回429(限流),说明端点规则生效;若全局规则生效,第3次请求就会返回429。

内容的提问来源于stack exchange,提问作者V. Periyasamy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:45:53