Dotnet -Ratelimiter muss in der Lage sein, eine asynchronisierte Funktion aufzurufenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Dotnet -Ratelimiter muss in der Lage sein, eine asynchronisierte Funktion aufzurufen

Post by Anonymous »

Ich verwende Microsoft.aspnetcore.Ratelimiting und füge eine neue Richtlinie hinzu, die einschränkt, wie viele Anrufe pro Minute für einen bestimmten Apikey ausgeführt werden können. Die meisten Schlüssel haben das gleiche Anruflimit, aber einige Schlüssel haben mehr oder weniger als die Standardeinstellung. Ich möchte den Code so aktualisieren, dass die Suche des Schlüssels, um festzustellen, ob er unterschiedliche Preise auf asynchronisierte Weise erfolgt oder nicht, aber ich erhalte immer wieder Kompilierfehler, wenn ich dem Func, der übergeben wird, einen asynchronisierten Spitznamen hinzufüge. Ich vermute, das ist nicht möglich, aber vielleicht gibt es eine andere Möglichkeit, dies zu tun? < /p>
unten ist der Code < /p>

Code: Select all

builder.Services.AddRateLimiter(options =>
{
options.OnRejected = async (context, cancellationToken) =>
{
if (context.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter))
{
context.HttpContext.Response.Headers.RetryAfter =
((int)retryAfter.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo);
}

context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
await context.HttpContext.Response.WriteAsync("Too many requests for your Api Key. Please try again later.", cancellationToken);
};

options.AddPolicy("ApiKey_Minute", context =>
{
var keyService = context.RequestServices.GetRequiredService();
var apiKey = context.Request.Headers["X-Api-Key"].FirstOrDefault();
var defaultLimit = RateLimitPartition.GetTokenBucketLimiter("defaultLimit", _ =>
new TokenBucketRateLimiterOptions
{
TokenLimit = 5,
TokensPerPeriod = 5,
ReplenishmentPeriod = TimeSpan.FromMinutes(1),
QueueLimit = 0,
AutoReplenishment = true
}); ;
if(string.IsNullOrWhiteSpace(apiKey))
{
return defaultLimit;
}
//currently this is not async but ideally should be
var keyInfo = keyService.LookupKey(apiKey);
if(keyInfo == null)
{
return defaultLimit;
}
var perMinuteLimiter = RateLimitPartition.GetFixedWindowLimiter(
partitionKey: $"{apiKey}-minute",
factory: _ => new FixedWindowRateLimiterOptions
{
PermitLimit = keyInfo.CallsPerMinute ?? 5, //TODO update to 50
Window = TimeSpan.FromMinutes(1),
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
QueueLimit = 2
}
);

return perMinuteLimiter;
});

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post