Возникла проблема с правильной реализацией базового ограничения скорости в веб-API ASP.NET Core 8.C#

Место общения программистов C#
Ответить
Anonymous
 Возникла проблема с правильной реализацией базового ограничения скорости в веб-API ASP.NET Core 8.

Сообщение Anonymous »

Я пытаюсь научиться использовать базовое ограничение скорости в веб-API ASP.NET Core 8.0. Я установил «лимит разрешений» на 5, «окно» на 1 минуту и ​​«лимит очереди» на 2.
На данном этапе позвольте мне сообщить вам, что у меня есть несколько сервисов, зарегистрированных в моем 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()
{
// ...
}
}
Пожалуйста, внимательно изучите мой код Program.cs, чтобы вы могли понять мой подход и, в частности, размещение методов AddFixedRateLimiter() и UseRateLimiter(). Как вы думаете, я правильно это реализовал? Почему Swagger показывает индикатор загрузки вместо того, чтобы возвращать ответ 429? Или я полностью ошибаюсь, и эта реализация работает нормально?
Пожалуйста, направьте меня в правильном направлении.

Подробнее здесь: https://stackoverflow.com/questions/797 ... t-core-8-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»