Rate limiting — control request frequency.
Setup:
1// Program.cs2builder.Services.AddRateLimiter(options =>3{4 options.RejectionStatusCode = StatusCodes.Status429TooManyRequests;56 // Fixed window7 options.AddFixedWindowLimiter("fixed", opt =>8 {9 opt.Window = TimeSpan.FromSeconds(10);10 opt.PermitLimit = 100;11 });1213 // Sliding window14 options.AddSlidingWindowLimiter("sliding", opt =>15 {16 opt.Window = TimeSpan.FromSeconds(60);17 opt.SegmentsPerWindow = 6;18 opt.PermitLimit = 100;19 });2021 // Token bucket22 options.AddTokenBucketLimiter("token", opt =>23 {24 opt.TokenLimit = 100;25 opt.ReplenishmentPeriod = TimeSpan.FromSeconds(10);26 opt.TokensPerPeriod = 10;27 });28});2930app.UseRateLimiter();
Per-endpoint:
1app.MapGet("/api/data", GetData)2 .RequireRateLimiting("fixed");
Custom policy:
1// Limit per user2var userPolicy = new RateLimiterOptions()3 .AddPolicy("perUser", context =>4 {5 var userId = context.User.FindFirst("sub")?.Value;6 return RateLimitPartition.GetTokenBucketLimiter(7 userId, _ => new TokenBucketRateLimiterOptions8 {9 TokenLimit = 100,10 ReplenishmentPeriod = TimeSpan.FromMinutes(1)11 });12 });