На данном этапе позвольте мне сообщить вам, что у меня есть несколько сервисов, зарегистрированных в моем Program.cs; например. для Swagger, для глобального обработчика исключений, для работы с базой данных Couchbase, для добавления средства ведения журнала Serilog и т. д.
Теперь я пытаюсь протестировать конечную точку по умолчанию в WeatherForecastControl, применив к ней [EnableRateLimiting("fixed")]. Но он работает не идеально, то есть так, как ожидалось. Первые 5 запросов возвращают данные должным образом. Шестой запрос заставляет Swagger отображать счетчик «загрузки» на неопределенный период. Я не использовал таймер или что-то еще, поэтому не знаю, работает ли он в течение 1 минуты или нет. Затем он снова извлекает и показывает данные со статусом 200 ОК.
Если мои знания мне не изменяют, 6-й запрос должен сразу же вернуть код состояния 429 с сообщением. Верно? У меня есть подозрение, что все это из-за неправильного размещения AddFixedRateLimiter() и UseRateLimiter() в моем файле Program.cs.
Позвольте мне поделиться кодом - RateLimiterExtension.cs:
Код: Выделить всё
public static class RateLimiterExtension
{
public static IServiceCollection AddFixedRateLimiter(this IServiceCollection services)
{
services.AddRateLimiter(options =>
{
options.AddFixedWindowLimiter("fixed", builder =>
{
builder.PermitLimit = 5; // Number of requests allowed
builder.Window = TimeSpan.FromMinutes(1); // Time window for the limit
builder.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; // Order of processing requests
builder.QueueLimit = 2; // Maximum number of requests in the queue
});
options.OnRejected = async (context, token) =>
{
context.HttpContext.Response.StatusCode = 429;
await context.HttpContext.Response.WriteAsync("Rate limit exceeded!", token);
};
});
return services;
}
}
Код: Выделить всё
Program.cs:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddTransient();
builder.Services.AddControllers();
builder.Services.AddSwaggerExplorer()
.InjectCouchbaseContext(builder.Configuration);
builder.Services.AddApplicationServices();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration)
.CreateLogger();
builder.Services.AddFixedRateLimiter();
var app = builder.Build();
app.ConfigureSwaggerExplorer()
.UseHttpsRedirection()
.UseAuthorization();
app.UseMiddleware();
app.UseRateLimiter();
app.MapControllers();
app.Lifetime.ApplicationStopped.Register(() =>
{
app.Services.GetRequiredService().Close();
});
app.Run();
Код: Выделить всё
[ApiController]
[Route("[controller]")]
[EnableRateLimiting("fixed")]
public class WeatherForecastController : ControllerBase
{
// ...
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable Get()
{
// ...
}
}
Пожалуйста, направьте меня в правильном направлении.
Подробнее здесь: https://stackoverflow.com/questions/797 ... t-core-8-w
Мобильная версия