Ограничение скорости .NET 8 с помощью политикиC#

Место общения программистов C#
Anonymous
Ограничение скорости .NET 8 с помощью политики

Сообщение Anonymous »

Я пытаюсь запустить промежуточное ПО ограничения скорости .NET 8 с глобальным ограничением скорости, а также определенной политикой для определенных конечных точек. Глобальная политика работает должным образом, но я не могу заставить работать политику, специфичную для конечной точки.
Я добавил следующее в свой Startup.cs

Код: Выделить всё

private void AddRateLimiter(IServiceCollection services)
{
logger.Information("Adding Rate Limiter");
services.AddRateLimiter(options =>
{
options.OnRejected = async (context, cancellationToken) =>
{
context.HttpContext.Response.StatusCode = 429;

if (context.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter))
{
await context.HttpContext.Response.WriteAsync(
$"Too many requests. Please try again after {retryAfter.TotalMinutes} minute(s). ", cancellationToken);
}
else
{
await context.HttpContext.Response.WriteAsync(
"Too many requests. Please try again later. ", cancellationToken);
}
};

options.AddPolicy("ThrottlePolicy", request =>
{
var ipAddress = request.Request.Headers["X-Forwarded-For"].ToString();
Console.WriteLine($"X-Forwarded-For: {ipAddress}");

return RateLimitPartition.GetFixedWindowLimiter(ipAddress, partition =>
new FixedWindowRateLimiterOptions
{
AutoReplenishment = true,
PermitLimit = 2,
Window = TimeSpan.FromHours(1)
});
});

options.GlobalLimiter = PartitionedRateLimiter.CreateChained(
PartitionedRateLimiter.Create(request =>
{
var ipAddress = request.Request.Headers["X-Forwarded-For"].ToString();
Console.WriteLine($"X-Forwarded-For (1-minute window): {ipAddress}");

return RateLimitPartition.GetFixedWindowLimiter(ipAddress, partition =>
new FixedWindowRateLimiterOptions
{
AutoReplenishment = true,
PermitLimit = 300,
Window = TimeSpan.FromMinutes(1)
});
}),
PartitionedRateLimiter.Create(request =>
{
var ipAddress = request.Request.Headers["X-Forwarded-For"].ToString();
Console.WriteLine($"X-Forwarded-For (1-hour window): {ipAddress}");

return RateLimitPartition.GetFixedWindowLimiter(ipAddress, partition =>
new FixedWindowRateLimiterOptions
{
AutoReplenishment = true,
PermitLimit = 3000,
Window = TimeSpan.FromHours(1)
});
}));
});
}
И затем на конечной точке контроллера у меня есть:

Код: Выделить всё

 [EnableRateLimiting(policyName: "ThrottlePolicy")]
[Authorize(Policy = "ViewPolicy")]
[HttpPost("{incident_Id}/[controller]")]
[DisableRequestSizeLimit]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(FileModel))]
public Task Post(string incident_Id, [FromForm] FilePostModel evidence)
{
return HandleRequestAsync(new FileAddRequest()
{
IncidentId = incident_Id,
NewEntity = evidence
});
}
С помощью ведения журнала консоли я могу видеть выполнение глобальных политик, но никогда не получаю никаких журналов для ThrottlePolicy. Не знаю, чего мне здесь не хватает.

Подробнее здесь: https://stackoverflow.com/questions/787 ... via-policy

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