Применение двух разных политик ограничения скорости к одной конечной точкеC#

Место общения программистов C#
Ответить
Anonymous
 Применение двух разных политик ограничения скорости к одной конечной точке

Сообщение Anonymous »

Я использую новую библиотеку ограничения скорости для .NET и не могу понять, как применить несколько политик к одной конечной точке. Я хочу добиться следующего: я хочу ограничить количество запросов к конечной точке на основе IP-адреса клиента и в то же время ограничить общий объем запросов от всех клиентов к одной и той же конечной точке. Таким образом, для API/ping конечной точки оно должно быть ограничено, например, 100 запросами в минуту для одного IP-адреса, но общим количеством запросов 1000 запросов в минуту для всех IP-адресов.
В настоящее время я м ограничение только по IP:

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

services.AddRateLimiter(options =>
{
options.AddPolicy("Api", httpContext =>
RateLimitPartition.GetSlidingWindowLimiter(httpContext.Connection.RemoteIpAddress,
_ => new SlidingWindowRateLimiterOptions
{
AutoReplenishment = true,
PermitLimit = 100,
QueueLimit = 0,
Window = TimeSpan.FromMinutes(1),
SegmentsPerWindow = 20
}));

options.OnRejected = async (context, token) =>
{
context.HttpContext.Response.StatusCode = 429;
await context.HttpContext.Response.WriteAsync(
"Too many requests. Please try again in a few moments. " +
"Read more about our rate limits at https://.",
cancellationToken: token);
};
});
Я понимаю, что есть что-то вроде PartitionedRateLimiter.CreateChained(), но для этого требуется, чтобы у каждого ограничителя был ключ раздела (т. е. IP-адрес клиента), но для моей второй политики я у меня нет ключа раздела, поскольку он общий для всех пользователей. Было бы идеально, если бы я мог сделать что-то вроде:

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

            PartitionedRateLimiter.CreateChained(
PartitionedRateLimiter.Create(httpContext =>
RateLimitPartition.GetSlidingWindowLimiter(httpContext.Connection.RemoteIpAddress.ToString(),
_ => new SlidingWindowRateLimiterOptions
{
AutoReplenishment = true,
PermitLimit = 100,
QueueLimit = 0,
Window = TimeSpan.FromMinutes(1),
SegmentsPerWindow = 20
})),
PartitionedRateLimiter.Create(httpContext =>
RateLimitPartition.GetSlidingWindowLimiter(NO PARTITION KEY HERE,
_ => new SlidingWindowRateLimiterOptions
{
AutoReplenishment = true,
PermitLimit = 1000,
QueueLimit = 0,
Window = TimeSpan.FromMinutes(1),
SegmentsPerWindow = 20
})));
Также невозможно применить несколько политик, используя что-то вроде [EnableRateLimiting("Policy1", "Policy2")] на моем контроллере.
Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/760 ... e-endpoint
Ответить

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

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

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

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

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