讲师中心 微信公众号
AI工具推荐 视频效率加速

C# RateLimiter中间件方法 C#如何配置固定窗口和滑动窗口限流

风晨同学_7647

风晨同学_7647

发布时间:2026-01-31 08:30:02

|

249人浏览过

|

来源于php中文网

原创

ASP.NET Core 8+固定窗口限流需用AddFixedWindowLimiter注册策略并配合UseRateLimiter启用,滑动窗口原生不支持,须自定义或借助Redis等外部存储实现。

c# ratelimiter中间件方法 c#如何配置固定窗口和滑动窗口限流

固定窗口限流用 RateLimitingMiddleware 配合 FixedWindowRateLimiter

ASP.NET Core 8+ 内置的限流中间件默认不启用任何策略,必须显式注册并配置。固定窗口的核心是“每 N 秒重置计数”,比如每 60 秒最多 100 次请求。

常见错误是只调用 AddRateLimiter 却没指定具体策略类型,导致运行时报 InvalidOperationException: No rate limiter policy is configured。

  • 在 Program.cs 中注册时,必须用 AddFixedWindowLimiter 并传入策略名(如 "fixed")和配置委托
  • Window 单位是 TimeSpan,写成 TimeSpan.FromMinutes(1) 比硬写 60000 毫秒更安全
  • 注意 PermitLimit 是窗口内总允许请求数,不是并发数;超限后默认返回 429,且不排队
builder.Services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("fixed", options =>
    {
        options.Window = TimeSpan.FromMinutes(1);
        options.PermitLimit = 100;
        options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
        options.QueueLimit = 0; // 不排队,直接拒绝
    });
});

滑动窗口限流需手动实现或换用第三方库

ASP.NET Core 原生 RateLimiter 目前(.NET 8 / 9 Preview)**不提供内置滑动窗口限流器**。官方只实现了 FixedWindowRateLimiter 和 SlidingWindowRateLimiter 的抽象基类,但后者未公开具体实现。

这意味着你不能像固定窗口那样直接调用 AddSlidingWindowLimiter —— 它根本不存在于 RateLimiterOptions 扩展方法中。

redis-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载
  • 若坚持用原生方案,只能基于 IServerRateLimiter 自定义实现,需维护时间分片(如 10 个 6 秒桶),处理跨桶聚合,逻辑复杂且易出错
  • 更现实的做法是引入 AspNetCoreRateLimit(已归档)或 Microsoft.Extensions.Resilience 中的 RateLimiter(.NET 8+ 实验性 API,仍不稳定)
  • 生产环境推荐用 StackExchange.Redis + Lua 脚本实现分布式滑动窗口,避免内存泄漏和节点间不同步

中间件启用时必须指定策略名,且顺序不能错

注册完策略只是第一步,中间件本身需要明确告诉它“对哪些请求应用哪个策略”。漏掉 UseRateLimiter 或策略名拼错,限流完全不生效,连日志都不会打。

  • UseRateLimiter() 必须放在 UseRouting() 之后、UseEndpoints() 之前
  • 策略名(如 "fixed")要和注册时完全一致,大小写敏感
  • 若想按路由或 Header 区分策略,得用 ConfigureRateLimiter + EndpointRateLimiter,而不是全局统一策略
app.UseRouting();
app.UseRateLimiter(); // 必须在这里

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers().RequireRateLimiting("fixed");
});

滑动窗口的“平滑”特性容易被误读为“更宽松”

滑动窗口不是简单地把固定窗口切碎再叠加,它的计数是动态滚动的:例如“每 60 秒最多 100 次”,第 59 秒发起的请求会同时计入第 1 秒和第 60 秒两个窗口片段,实际允许短时突发更高——但这不是 bug,是设计使然。

如果你发现滑动窗口比预期放行更多请求,先确认是否混淆了“窗口长度”和“滑动粒度”。比如 Redis 实现中用 6 秒分片 × 10 片 = 60 秒窗口,但每个请求只更新当前分片,查询时 sum 最近 10 个分片值。这个 sum 过程如果没原子执行,就会出现竞态漏计。

  • 单机滑动窗口用 ConcurrentDictionary<datetime int></datetime> 加锁维护,性能差、GC 压力大,不建议
  • 真正可靠的滑动窗口几乎都依赖外部存储(Redis、SQL Server 的行级锁 + TTL)
  • 别为了“听起来高级”强行上滑动窗口——固定窗口在多数 API 场景下更稳定、更容易监控和调试

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4603

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

951

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1209

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6581

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3343

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6560

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9001

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1230

2024.04.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn