✅ Rate limiting no worky
Got rate limiting all set up:
and registered
got rate limiting set on an endpoint:
and yet I can spam it ad infinitum and rate limiting never triggers. What gives?
public static class RateLimiting
{
public const string Rss = nameof(Rss);
public const string Quotes = nameof(Quotes);
public const string Reports = nameof(Reports);
public static IServiceCollection AddRateLimiting(this IServiceCollection services)
{
return services.AddRateLimiter(x => x
.AddFixedWindowLimiter(policyName: Rss, options => {
options.Window = TimeSpan.FromHours(1);
})
.AddFixedWindowLimiter(policyName: Quotes, options => {
options.Window = TimeSpan.FromSeconds(10);
})
.AddFixedWindowLimiter(policyName: Reports, options => {
options.Window = TimeSpan.FromHours(1);
options.PermitLimit = 3;
})
);
}
}public static class RateLimiting
{
public const string Rss = nameof(Rss);
public const string Quotes = nameof(Quotes);
public const string Reports = nameof(Reports);
public static IServiceCollection AddRateLimiting(this IServiceCollection services)
{
return services.AddRateLimiter(x => x
.AddFixedWindowLimiter(policyName: Rss, options => {
options.Window = TimeSpan.FromHours(1);
})
.AddFixedWindowLimiter(policyName: Quotes, options => {
options.Window = TimeSpan.FromSeconds(10);
})
.AddFixedWindowLimiter(policyName: Reports, options => {
options.Window = TimeSpan.FromHours(1);
options.PermitLimit = 3;
})
);
}
}and registered
services.AddRateLimiting();services.AddRateLimiting();app.UseRateLimiter();app.UseRateLimiter();got rate limiting set on an endpoint:
using ReturnType = Results<NotFound, Ok<QuoteDto>>;
[Handler]
[MapGet("api/quotes/random")]
public static partial class GetRandomQuote
{
internal static void CustomizeEndpoint(IEndpointConventionBuilder endpoint) => endpoint
.RequireRateLimiting(RateLimiting.Quotes);
[UsedImplicitly]
public sealed record Query;
private static async ValueTask<ReturnType> HandleAsync(Query _, ApplicationDbContext context, CancellationToken cancellationToken)
{
var quote = await context.Database.SqlQueryRaw<QuoteDto>("""
SELECT q."Author", q."Body"
FROM "Quotes" q
TABLESAMPLE SYSTEM_ROWS(1)
LIMIT 1
""")
.FirstOrDefaultAsync(cancellationToken);
return quote is null ? TypedResults.NotFound() : TypedResults.Ok(quote);
}
}using ReturnType = Results<NotFound, Ok<QuoteDto>>;
[Handler]
[MapGet("api/quotes/random")]
public static partial class GetRandomQuote
{
internal static void CustomizeEndpoint(IEndpointConventionBuilder endpoint) => endpoint
.RequireRateLimiting(RateLimiting.Quotes);
[UsedImplicitly]
public sealed record Query;
private static async ValueTask<ReturnType> HandleAsync(Query _, ApplicationDbContext context, CancellationToken cancellationToken)
{
var quote = await context.Database.SqlQueryRaw<QuoteDto>("""
SELECT q."Author", q."Body"
FROM "Quotes" q
TABLESAMPLE SYSTEM_ROWS(1)
LIMIT 1
""")
.FirstOrDefaultAsync(cancellationToken);
return quote is null ? TypedResults.NotFound() : TypedResults.Ok(quote);
}
}and yet I can spam it ad infinitum and rate limiting never triggers. What gives?