C#C
C#16mo ago
Angius

✅ Rate limiting no worky

Got rate limiting all set up:
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();

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);
    }
}

and yet I can spam it ad infinitum and rate limiting never triggers. What gives?
Was this page helpful?