dotnet / dotnet/aspnetcore

Convenience methods for adding well-known limiter types with more fine grained keys

Open
#44,850 1 comment 1 reaction 0 assignees View on GitHub
api-suggestion area-networking
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.