Advertisement
Guest User

Untitled

a guest
May 27th, 2022
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.71 KB | None | 0 0
  1. public async Task TooManyRequests()
  2. {
  3.     var client = new RestClient("https://httpstat.us/429");
  4.     var request = new RestRequest();
  5.  
  6.     var context = new Context().WithLogger(_logger);
  7.     var response = await Policies.AsyncRateLimit().ExecuteAsync(ctx => client.ExecuteAsync(request), context);
  8. }
  9.  
  10. public static AsyncRetryPolicy<RestResponse> AsyncRateLimit()
  11. {
  12.     return Policy.HandleResult<RestResponse>(response => response.StatusCode == HttpStatusCode.TooManyRequests)
  13.         .WaitAndRetryAsync(RateLimitRetryCount,
  14.             (attemptCount, restResponse, _) =>
  15.             {
  16.                 var retryAfterHeader = restResponse?.Result?.Headers?.SingleOrDefault(h => h.Name == "Retry-After");
  17.                 double secondsInterval = 0;
  18.  
  19.                 if (retryAfterHeader != null)
  20.                 {
  21.                     var value = retryAfterHeader.Value?.ToString();
  22.                     if (!double.TryParse(value, out secondsInterval))
  23.                     {
  24.                         secondsInterval = Math.Pow(2, attemptCount);
  25.                     }
  26.                 }
  27.  
  28.                 return TimeSpan.FromSeconds(secondsInterval);
  29.             },
  30.             (response, timeSpan, retryCount, context) =>
  31.             {
  32.                 var logger = context.GetLogger();
  33.  
  34.                 logger?.LogTrace(
  35.                     "The API request has been rate limited. HttpStatusCode={StatusCode}. Waiting {Seconds} seconds before retry. Number attempt {RetryCount}. Uri={Url}; RequestResponse={Content}",
  36.                     response.Result.StatusCode, timeSpan.TotalSeconds, retryCount, response.Result.ResponseUri, response.Result.Content);
  37.  
  38.                 return Task.CompletedTask;
  39.             });
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement