Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public async Task TooManyRequests()
- {
- var client = new RestClient("https://httpstat.us/429");
- var request = new RestRequest();
- var context = new Context().WithLogger(_logger);
- var response = await Policies.AsyncRateLimit().ExecuteAsync(ctx => client.ExecuteAsync(request), context);
- }
- public static AsyncRetryPolicy<RestResponse> AsyncRateLimit()
- {
- return Policy.HandleResult<RestResponse>(response => response.StatusCode == HttpStatusCode.TooManyRequests)
- .WaitAndRetryAsync(RateLimitRetryCount,
- (attemptCount, restResponse, _) =>
- {
- var retryAfterHeader = restResponse?.Result?.Headers?.SingleOrDefault(h => h.Name == "Retry-After");
- double secondsInterval = 0;
- if (retryAfterHeader != null)
- {
- var value = retryAfterHeader.Value?.ToString();
- if (!double.TryParse(value, out secondsInterval))
- {
- secondsInterval = Math.Pow(2, attemptCount);
- }
- }
- return TimeSpan.FromSeconds(secondsInterval);
- },
- (response, timeSpan, retryCount, context) =>
- {
- var logger = context.GetLogger();
- logger?.LogTrace(
- "The API request has been rate limited. HttpStatusCode={StatusCode}. Waiting {Seconds} seconds before retry. Number attempt {RetryCount}. Uri={Url}; RequestResponse={Content}",
- response.Result.StatusCode, timeSpan.TotalSeconds, retryCount, response.Result.ResponseUri, response.Result.Content);
- return Task.CompletedTask;
- });
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement