Convenience methods for adding well-known limiter types with more fine grained keys
- Dominant language
- C#
- Stars
- 38.4k
- Forks
- 10.9k
- Avg merge
- 2d 6h
- Merged PRs (30d)
- 290
Description
## Background and Motivation
It's a common scenario to add a `FixedWindow`/`SlidingWindow`/etc. limiter partitioned based on, e.g., `httpContext.Request.Path`. Today our convenience methods only allow adding these well-known limiters blindly to an endpoint or controller
## Proposed API
```diff
namespace Microsoft.AspNetCore.RateLimiting;
public static class RateLimiterOptionsExtensions
{
+ public static RateLimiterOptions AddTokenBucketLimiter(this RateLimiterOptions options, string policyName, Action configureOptions, Func partitioner);
+ public static RateLimiterOptions AddFixedWindowLimiter(this RateLimiterOptions options, string policyName, Action configureOptions, Func partitioner);
+ public static RateLimiterOptions AddSlidingWindowLimiter(this RateLimiterOptions options, string policyName, Action configureOptions, Func partitioner);
+ public static RateLimiterOptions AddConcurrencyLimiter(this RateLimiterOptions options, string policyName, Action configureOptions, Func partitioner);
}
```
## Usage Examples
```csharp
builder.Services.AddRateLimiter(options =>
{
options.AddFixedWindowLimiter("NotTooFast", limiter =>
{
limiter.Window = TimeSpan.FromSeconds(5);
limiter.PermitLimit = 5;
limiter.QueueLimit = 0;
},
httpContext =>
{
return httpContext.Request.Path;
});
});
```
Contributor guide
Assessment
This issue has not been assessed yet.