Я добавил следующее в свой 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
});
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... via-policy