.NET Core 7限流:获取剩余许可数时遇GetLimiter不存在错误
问题分析
报错The Name GetLimiter does not exist in current context是因为.NET Rate Limiting库中没有内置GetLimiter()方法,你需要通过依赖注入的方式获取已配置的限流器实例,而非调用一个不存在的方法。
解决方案
1. 注入限流器工厂
在控制器或服务的构造函数中注入IRateLimiterFactory,用于获取已配置的限流器:
private readonly IRateLimiterFactory _rateLimiterFactory; public YourController(IRateLimiterFactory rateLimiterFactory) { _rateLimiterFactory = rateLimiterFactory; }
2. 获取对应IP的限流器实例
假设你配置的IP限流策略名为IPBased(与AddRateLimiter中定义的策略名称一致),先获取当前请求的IP地址,再通过工厂创建对应的限流器实例(以令牌桶限流器为例):
// 获取当前请求的IP地址 var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown"; // 创建对应IP的令牌桶限流器 var tokenBucketLimiter = _rateLimiterFactory.CreateTokenBucketLimiter("IPBased", ipAddress);
3. 查询剩余许可数
调用令牌桶限流器的GetCurrentAvailableTokens()方法,直接获取剩余可用令牌数:
int remainingPermits = tokenBucketLimiter.GetCurrentAvailableTokens();
完整控制器示例
[ApiController] [Route("api/[controller]")] public class LimitCheckController : ControllerBase { private readonly IRateLimiterFactory _rateLimiterFactory; public LimitCheckController(IRateLimiterFactory rateLimiterFactory) { _rateLimiterFactory = rateLimiterFactory; } [HttpGet("remaining-permits")] public IActionResult GetRemainingPermits() { var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown"; var limiter = _rateLimiterFactory.CreateTokenBucketLimiter("IPBased", ipAddress); int remaining = limiter.GetCurrentAvailableTokens(); return Ok($"当前IP剩余许可数:{remaining}"); } }
注意事项
- 若使用的是并发限流器
ConcurrencyLimiter,需调用CreateConcurrencyLimiter方法,剩余许可数通过GetCurrentAvailablePermits()获取。 - 确保代码中使用的策略名称与
Program.cs里配置限流时的名称完全一致。
内容的提问来源于stack exchange,提问作者Sami In
相关产品推荐
相关产品推荐

