Los informes son muy comunes en cualquier sistema y algunos de ellos pueden ser muy pesados de procesar. Por lo tanto, en este caso, la aplicación puede degradarse durante la generación del informe, afectando a otros usuarios. Pero, ¿cómo podemos evitar esto? El primer pensamiento sería bloquear el fondo, ¿verdad? Um, pero es tan fácil de piratear que el usuario puede editar los accesorios HTML y habilitarlo nuevamente. Por lo tanto, la mejor opción es bloquearlo en el lado del servidor, utilizando alguna estrategia de control de límite de solicitud.
AspNetCoreRateLimit es una biblioteca que puede ayudarnos con el control de la solicitud. Puede definir reglas para decidir cuántas veces un cliente puede llamar al recurso durante un período de tiempo.
Pero, ¿cómo funciona?
ASPNETCORERATELIMIT utiliza la solución MemoryCache para guardar información sobre las solicitudes del cliente. Por ejemplo, un cliente solo puede hacer 10 solicitudes en un intervalo de 5 segundos para un punto final específico. Por lo tanto, cada solicitud se guardará en la memoria caché de memoria y si el cliente excede este límite, la aplicación detendrá la solicitud y devolverá un estado de error HTTP.
En primer lugar, necesitamos instalar la biblioteca AspnetCorerAtelimit
La mejor opción para configurar AspnetCorerAtelimit es definir toda la información dentro de AppSettings.json. Entonces, crearemos un bloque como este:
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"GeneralRules": [
{
"Endpoint": "*/api/test",
"Period": "2s", //interval
"Limit": 2 //limit of request in the interval
}
]
},
Con nuestras reglas configuradas, necesitamos agregar pocas líneas en Startup.cs :
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
//AspNetCoreRateLimit uses MemoryCache to control the numbers of requests
services.AddMemoryCache();
//Adding AspNetCoreRateLimit rules
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//Adding the store
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
//Adding the request counter
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddHttpContextAccessor();
services.AddControllers();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "RequestLimit", Version = "v1" });
});
}
Y el paso final es activar el servicio:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "RequestLimit v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseIpRateLimiting() //Adding this block;
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Y está hecho, ahora nuestra API tiene un control de solicitud. Puede personalizar su configuración para seguir las reglas de los detalles, todas las opciones se enumeran aquí: https://github.com/stefanprodan/aspnetcoreratelimit