File: SampleRateLimiterPolicy.cs
Web Access
Project: src\src\Middleware\RateLimiting\samples\RateLimitingSample\RateLimitingSample.csproj (RateLimitingSample)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Threading.RateLimiting;
using Microsoft.AspNetCore.RateLimiting;
 
namespace RateLimitingSample;
 
public class SampleRateLimiterPolicy : IRateLimiterPolicy<string>
{
    private Func<OnRejectedContext, CancellationToken, ValueTask>? _onRejected;
 
    public SampleRateLimiterPolicy(ILogger<SampleRateLimiterPolicy> logger)
    {
        _onRejected = (context, token) =>
        {
            context.HttpContext.Response.StatusCode = 429;
            logger.LogInformation($"Request rejected by {nameof(SampleRateLimiterPolicy)}");
            return ValueTask.CompletedTask;
        };
    }
 
    public Func<OnRejectedContext, CancellationToken, ValueTask>? OnRejected { get => _onRejected; }
 
    // Use a sliding window limiter allowing 1 request every 10 seconds
    public RateLimitPartition<string> GetPartition(HttpContext httpContext)
    {
        return RateLimitPartition.GetSlidingWindowLimiter<string>(string.Empty, key => new SlidingWindowRateLimiterOptions
        {
            PermitLimit = 1,
            QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
            QueueLimit = 1,
            Window = TimeSpan.FromSeconds(5),
            SegmentsPerWindow = 1
        });
    }
}