Niveau :


7 minutes de lecture

Dans cet article, vous allez apprendre à utiliser une nouvelle fonctionnalité de .Net 7 à savoir, le RateLimiting ainsi :
- Qu’est-ce que le RateLimiting ?
- Prérequis
- Configuration du RateLimiting fixe
- Configuration du RateLimiting sliding
Qu’est-ce que le RateLimiting ?
Le RateLimiting vous permet de protéger et gérer une stratégie de limitation de débit. Vous retrouvez souvent cette fonctionnalité sur des Api tiers que vous testez en mode démonstration. Elles vous limitent les appels sur un intervalle de temps comme par exemple, 100 appels par heures ou 6 appels par minutes…
Cette fonctionnalité est très pratique quand on veut gérer les débits et coûts sur des environnements de développements ou de tests.
Prérequis
- Un projet web comme par exemple le template API web ASP.NET Core
Configuration du RateLimiting fixe
Dans le projet ci-dessus, configurons notre middleware RateLimiting pour appliquer une stratégie fixe concernant les appels. C’est à dire que nous allons fixer un nombre maximum d’appels pour une durée fixe comme ci-dessous :
using Microsoft.AspNetCore.RateLimiting;
using System.Threading.RateLimiting;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddRateLimiter(_ => _
.AddFixedWindowLimiter(policyName: "RateLimiterFixed", options =>
{
options.PermitLimit = 4;
options.Window = TimeSpan.FromSeconds(30);
options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
options.QueueLimit = 2;
}));
var app = builder.Build();
app.UseRateLimiter();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Dans le controller rajoutez la stratégie comme attribut de méthode comme ci-dessous :
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.RateLimiting;
namespace NewsNet7RateLimiting.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
[EnableRateLimiting("RateLimiterFixed")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}
Si vous effectuez le test, vous verrez qu’à partir du quatrième appels l’appel sera bloqué pendant 30 secondes et l’api répondra une fois ce laps de temps passé comme ci-dessous :

Configuration du RateLimiting sliding
Vous pouvez aussi choisir une stratégie de type Sliding, à savoir que vous allez définir une zone de consommation coulissante moins restrictive que la stratégie fixe. Par exemple, je peux définir 3 appels maximum pour 15 secondes avec une régénération tous les 5 secondes du nombre d’appel qui aurait été consommé durant ces 5 secondes. Pas évident à comprendre, aussi voyons dans l’exemple ci-dessous :
builder.Services.AddRateLimiter(_ => _
.AddSlidingWindowLimiter(policyName: "RateLimiterSliding", options =>
{
options.PermitLimit = 3;
options.Window = TimeSpan.FromSeconds(15);
options.QueueProcessingOrder= QueueProcessingOrder.OldestFirst;
options.SegmentsPerWindow = 3;
options.QueueLimit = 2;
}));
[HttpGet(Name = "GetWeatherForecast")]
//[EnableRateLimiting("RateLimiterFixed")]
[EnableRateLimiting("RateLimiterSliding")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
Pour tester cette exemple, faite un appel toutes les 5 secondes et vous verrez qu’au bout de 15 secondes, vous n’aurez qu’un appel possible et non trois. En effet, cette stratégie permet de renouveler uniquement les appels consommé sur le laps de temps définit. Si vous effectuez 2 appels sur les premières 5 secondes, alors au bout de 15 secondes vous renouvellerez 2 appels :

