Mediarq.RateLimiting
1.5.1
dotnet add package Mediarq.RateLimiting --version 1.5.1
NuGet\Install-Package Mediarq.RateLimiting -Version 1.5.1
<PackageReference Include="Mediarq.RateLimiting" Version="1.5.1" />
<PackageVersion Include="Mediarq.RateLimiting" Version="1.5.1" />
<PackageReference Include="Mediarq.RateLimiting" />
paket add Mediarq.RateLimiting --version 1.5.1
#r "nuget: Mediarq.RateLimiting, 1.5.1"
#:package Mediarq.RateLimiting@1.5.1
#addin nuget:?package=Mediarq.RateLimiting&version=1.5.1
#tool nuget:?package=Mediarq.RateLimiting&version=1.5.1
Mediarq.RateLimiting
Rate limiting as a pipeline behavior, built on System.Threading.RateLimiting: mark a command/query as
IRateLimitedRequest, and it acquires a permit from a named policy before its handler runs — no global
middleware, no HTTP dependency.
dotnet add package Mediarq.RateLimiting
Usage
builder.Services.AddMediarqRateLimiting(registry =>
{
registry.AddPolicy("orders-per-user", key => RateLimitPartition.GetFixedWindowLimiter(key, _ => new FixedWindowRateLimiterOptions
{
Window = TimeSpan.FromMinutes(1),
PermitLimit = 10,
}));
});
public record CreateOrder(string Customer) : ICommand<Result<Guid>>, IRateLimitedRequest
{
public string PolicyName => "orders-per-user";
public string? PartitionKey => Customer; // independent limit per customer; omit for a single shared bucket
}
key in AddPolicy receives PartitionKey (or "*" when null) — build any RateLimitPartition<string>
from it: GetFixedWindowLimiter, GetSlidingWindowLimiter, GetTokenBucketLimiter, GetConcurrencyLimiter,
GetNoLimiter, all from System.Threading.RateLimiting.
Handling a rejection
No permit available → RateLimitExceededException (PolicyName, PartitionKey, RetryAfter when the
limiter reports one). Catch it with an IRequestExceptionHandler<TRequest, TResponse> to turn it into a
typed Result failure, or with an ASP.NET Core exception handler to return 429 Too Many Requests.
Learn more
Wiring extensions · Full README
MIT © Nicolas Rouffart
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Mediarq.Core (>= 1.5.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- System.Threading.RateLimiting (>= 8.0.0)
-
net8.0
- Mediarq.Core (>= 1.5.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- System.Threading.RateLimiting (>= 8.0.0)
-
net9.0
- Mediarq.Core (>= 1.5.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- System.Threading.RateLimiting (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.