I am using multiple rate-limiting policies in my .NET application, and I want to determine which specific policy caused a request to be rejected (HTTP 429). This is important for logging and metrics purposes.
I have defined multiple policies using RateLimitPartition.GetFixedWindowLimiter as follows:
limiterOptions.AddPolicy("InternalServicePolicy", httpContext =>
{
return RateLimitPartition.GetFixedWindowLimiter("InternalServicePolicy",
_ => new FixedWindowRateLimiterOptions()
{
PermitLimit = rateLimitingOptions.InternalServicePolicyOptions.PermitLimit,
Window = TimeSpan.FromSeconds(rateLimitingOptions.InternalServicePolicyOptions.TimePeriod),
AutoReplenishment = true,
QueueLimit = 0,
});
});
limiterOptions.AddPolicy("ThirdPartyPolicy", httpContext =>
{
return RateLimitPartition.GetFixedWindowLimiter("ThirdPartyPolicy",
_ => new FixedWindowRateLimiterOptions()
{
PermitLimit = rateLimitingOptions.ThirdPartyPolicyOptions.PermitLimit,
Window = TimeSpan.FromSeconds(rateLimitingOptions.ThirdPartyPolicyOptions.TimePeriod),
AutoReplenishment = true,
QueueLimit = 0,
});
});
limiterOptions.OnRejected = async (context, cancellationToken) =>
{
// Metrics and logging
context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
await context.HttpContext.Response.WriteAsync(
"Too many requests. Please try again later. " +
"Read more about our rate limits at .", cancellationToken: cancellationToken);
};
I am using multiple rate-limiting policies in my .NET application, and I want to determine which specific policy caused a request to be rejected (HTTP 429). This is important for logging and metrics purposes.
I have defined multiple policies using RateLimitPartition.GetFixedWindowLimiter as follows:
limiterOptions.AddPolicy("InternalServicePolicy", httpContext =>
{
return RateLimitPartition.GetFixedWindowLimiter("InternalServicePolicy",
_ => new FixedWindowRateLimiterOptions()
{
PermitLimit = rateLimitingOptions.InternalServicePolicyOptions.PermitLimit,
Window = TimeSpan.FromSeconds(rateLimitingOptions.InternalServicePolicyOptions.TimePeriod),
AutoReplenishment = true,
QueueLimit = 0,
});
});
limiterOptions.AddPolicy("ThirdPartyPolicy", httpContext =>
{
return RateLimitPartition.GetFixedWindowLimiter("ThirdPartyPolicy",
_ => new FixedWindowRateLimiterOptions()
{
PermitLimit = rateLimitingOptions.ThirdPartyPolicyOptions.PermitLimit,
Window = TimeSpan.FromSeconds(rateLimitingOptions.ThirdPartyPolicyOptions.TimePeriod),
AutoReplenishment = true,
QueueLimit = 0,
});
});
limiterOptions.OnRejected = async (context, cancellationToken) =>
{
// Metrics and logging
context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
await context.HttpContext.Response.WriteAsync(
"Too many requests. Please try again later. " +
"Read more about our rate limits at https://example.org/docs/ratelimiting.", cancellationToken: cancellationToken);
};
Share
Improve this question
edited yesterday
DavidG
119k13 gold badges228 silver badges234 bronze badges
asked yesterday
Navid ZareNavid Zare
331 silver badge4 bronze badges
New contributor
Navid Zare is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
2
|
1 Answer
Reset to default 1The easiest way is to rely on the endpoint metadata:
limiterOptions.OnRejected = async (context, cancellationToken) =>
{
// Metrics and logging
// policyName from metadata
var policyName = context.HttpContext
.GetEndpoint()
.Metadata
.GetMetadata<EnableRateLimitingAttribute>()
.PolicyName;
context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
await context.HttpContext.Response.WriteAsync(
"Too many requests. Please try again later. " +
"Read more about our rate limits at https://example.org/docs/ratelimiting.", cancellationToken: cancellationToken);
};
context.Lease
on theOnRejected
callback have something you can use? – DavidG Commented yesterday