Отчеты очень распространены в любой системе, и некоторые из них могут быть очень тяжелыми для обработки. Следовательно, в этом случае приложение может быть ухудшено во время генерации отчета, затрагивая других пользователей. Но как мы можем избежать этого? Первая мысль будет заблокировать дно, верно? Хм, но это так легко взломать, пользователь может просто отредактировать HTML -реквизит и включить его снова. Поэтому наилучшим вариантом является заблокирование его на стороне сервера, используя некоторую стратегию управления ограничением запроса.
AspNetCoreRateLimit - это библиотека, которая может помочь нам с контролем реквизиции. Вы можете определить правила, чтобы решить, сколько раз клиент может вызвать ресурс в течение определенного периода времени.
Но как это работает?
AspnetCoreratelImit использует решение MemoryCache для сохранения информации о клиентских запросах. Например, клиент может сделать только 10 запросов в 5-секундном интервале для определенной конечной точки. Таким образом, каждый запрос будет сохранен в кэше памяти, и если клиент превышает этот предел, приложение остановит запрос и вернет статус ошибки HTTP.
Прежде всего, нам нужно установить библиотеку aspntcoreratelimit
Лучший вариант настройки AspnetCoreratelImit - определить всю информацию в Appsettings.json. Итак, мы создадим блок, как это:
"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
}
]
},
С нашими правилами конфигурировано, нам нужно добавить несколько строк в 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" });
});
}
И последний шаг - активировать сервис:
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();
});
}
И это сделано, теперь у нашего API есть контроль запросов. Вы можете настроить свою конфигурацию, чтобы следовать правилам специфики, все параметры перечислены здесь: https://github.com/stefanprodan/aspnetcoreratelimit