C#如何实现Rate Limiting ASP.NET Core速率限制中间件用法

发布时间 - 2026-01-29 00:00:00    点击率:
推荐使用.NET 7+内置Microsoft.AspNetCore.RateLimiting包,通过AddRateLimiter注册策略、UseRateLimiter启用中间件,并用[EnableRateLimiti

ng]特性应用到控制器或方法,支持Fixed Window、Sliding Window等算法及自定义限流键。

ASP.NET Core 中实现速率限制(Rate Limiting)推荐使用官方内置的 Microsoft.AspNetCore.RateLimiting 包(.NET 7+ 原生支持),它比第三方库更轻量、更集成、更易配置。

启用 Rate Limiting 中间件

Program.cs 中注册并启用中间件:

  • 调用 AddRateLimiter() 添加服务,可配置多种策略
  • 调用 UseRateLimiter() 启用中间件(必须放在 UseAuthorization() 之后、UseEndpoints() 之前)

示例:

// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("fixed", opt =>
    {
        opt.Window = TimeSpan.FromSeconds(60);
        opt.PermitLimit = 10;
        opt.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
        opt.QueueLimit = 5;
    });
});
// ... 其他服务注册

var app = builder.Build();
app.UseRateLimiter(); // ⚠️ 位置很重要
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();

为控制器或方法应用限流策略

使用 [EnableRateLimiting("policy-name")] 特性标记端点:

  • 可加在 Controller 类上(全局生效),也可加在单个 Action 方法上(更精细)
  • 策略名必须与 AddRateLimiter 中注册的名称一致
  • 未标记的端点默认不受限

示例:

[ApiController]
[Route("api/[controller]")]
[EnableRateLimiting("fixed")] // 整个控制器启用
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult Get() => Ok(new[] { "a", "b" });

    [HttpPost]
    [DisableRateLimiting] // 可对个别方法禁用
    public IActionResult Post() => Ok();
}

支持的限流算法及配置要点

内置策略包括 Fixed Window、Sliding Window、Token Bucket,常用的是前两种:

  • Fixed Window:简单高效,但存在窗口边界突增问题(如每分钟10次,0:59和1:00各来10次 → 实际20次)
  • Sliding Window:更精准(如每60秒最多10次),适合高一致性要求场景,但需存储支持(如 Redis)
  • 策略可指定 KeyGenerator 自定义限流键,例如按 IP、用户 ID 或请求头区分

Sliding Window 示例:

options.AddSlidingWindowLimiter("sliding", opt =>
{
    opt.Window = TimeSpan.FromMinutes(1);
    opt.SegmentsPerWindow = 12; // 拆成12段(每5秒一段)
    opt.PermitLimit = 10;
    opt.QueueLimit = 3;
});

自定义限流键(按用户/IP/租户区分)

默认按客户端 IP 限流,可通过 KeyGenerator 改为按用户身份、请求头等维度:

  • 返回字符串作为唯一键,相同键共享配额
  • 例如:登录用户用 HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value
  • 注意空值处理,避免 null 引发异常

示例(按用户 ID):

options.AddFixedWindowLimiter("per-user", opt =>
{
    opt.Window = TimeSpan.FromMinutes(1);
    opt.PermitLimit = 5;
    opt.KeyGenerator = async context =>
    {
        var userId = context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? "anonymous";
        return userId;
    };
});

基本上就这些。官方 Rate Limiting 中间件开箱即用,无需额外存储(Fixed Window 内存即可),配合策略配置和特性标注,就能快速落地生产级限流能力。


# redis  # go  # app  # ai  # win  # microsoft  # c#  # .net  # red  # 中间件  # NULL  # Token  # 字符串  # 算法  # 自定义  # 推荐使用  # 加在  # 的是  # 放在  # 就能  # 最多  # 两种  # 也可  # 很重要 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 教学论文网站制作软件有哪些,写论文用什么软件 ?  Android滚轮选择时间控件使用详解  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何用腾讯建站主机快速创建免费网站?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  高端智能建站公司优选:品牌定制与SEO优化一站式服务  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何快速辨别茅台真假?关键步骤解析  如何在Windows环境下新建FTP站点并设置权限?  Laravel如何配置Horizon来管理队列?(安装和使用)  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel如何配置和使用缓存?(Redis代码示例)  javascript中对象的定义、使用以及对象和原型链操作小结  简历没回改:利用AI润色让你的文字更专业  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何解决hover在ie6中的兼容性问题  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel如何为API编写文档_Laravel API文档生成与维护方法  IOS倒计时设置UIButton标题title的抖动问题  再谈Python中的字符串与字符编码(推荐)  如何在IIS中新建站点并配置端口与物理路径?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  动图在线制作网站有哪些,滑动动图图集怎么做?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何在宝塔面板中修改默认建站目录?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何自定义建站之星网站的导航菜单样式?  EditPlus中的正则表达式实战(6)  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  java ZXing生成二维码及条码实例分享  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  用v-html解决Vue.js渲染中html标签不被解析的问题  南京网站制作费用,南京远驱官方网站?  如何快速启动建站代理加盟业务?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何快速搭建二级域名独立网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?