Example #1
0
        public Task <HttpResponseMessage> MakeRetryingCall(
            Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > asyncHttpCall,
            HttpRequestMessage requestMessage,
            CancellationToken cancellationToken)
        {
            AsyncTimeoutPolicy timeOutPolicy = Policy.TimeoutAsync(
                retryConfiguration.TotalElapsedTimeInSecs,
                TimeoutStrategy.Optimistic,
                onTimeoutAsync: (context, timespan, t1, exception) => throw new OciException(
                    HttpStatusCode.RequestTimeout,
                    "Request has been timed out. Please increase the total elapsed time for this request and retry",
                    "Unknown",
                    exception)
                );

            AsyncRetryPolicy <HttpResponseMessage> retryAndSleepPolicy = Policy
                                                                         .HandleResult <HttpResponseMessage>(r => ShoulRetryOnHttpResponse(r))
                                                                         .WaitAndRetryAsync(
                retryCount: retryConfiguration.MaxAttempts,
                sleepDurationProvider: (retryCount, response, context) => TimeSpan.FromSeconds(retryConfiguration.GetNextDelayInSeconds(retryCount)),
                onRetryAsync: async(response, timespan, retryAttempt, context) =>
            {
                logger.Info($"Retry Attempt: {retryAttempt}");
                await Task.CompletedTask;
            }
                );

            return(timeOutPolicy
                   .WrapAsync(retryAndSleepPolicy)
                   .ExecuteAsync(() => asyncHttpCall.Invoke(requestMessage, cancellationToken)));
        }
        public Task <HttpResponseMessage> MakeRetryingCall(
            Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > asyncHttpCall,
            HttpRequestMessage requestMessage,
            CancellationToken cancellationToken)
        {
            AsyncTimeoutPolicy timeOutPolicy = Policy.TimeoutAsync(
                retryConfiguration.TotalElapsedTimeInSecs,
                TimeoutStrategy.Optimistic,
                onTimeoutAsync: (context, timespan, t1, exception) => throw new OciException(
                    HttpStatusCode.RequestTimeout,
                    "Request has been timed out. Please increase the total elapsed time for this request and retry",
                    "Unknown",
                    exception)
                );

            AsyncRetryPolicy <HttpResponseMessage> retryAndSleepPolicy = Policy
                                                                         .HandleResult <HttpResponseMessage>(r => ShoulRetryOnHttpResponse(r))
                                                                         .WaitAndRetryAsync(
                retryCount: retryConfiguration.MaxAttempts,
                sleepDurationProvider: (retryCount, response, context) => TimeSpan.FromSeconds(retryConfiguration.GetNextDelayInSeconds(retryCount)),
                onRetryAsync: async(response, timespan, retryAttempt, context) =>
            {
                logger.Info($"Retry Attempt: {retryAttempt}");
                await Task.CompletedTask.ConfigureAwait(false);
            }
                );

            return(timeOutPolicy
                   .WrapAsync(retryAndSleepPolicy)
                   .ExecuteAsync(async() =>
            {
                // A new copy of the request message needs to be created because it is disposed each time it is sent, and
                // resending the same request will result in the following error message:
                // "The request message was already sent. Cannot send the same request message multiple times."
                var newRequestMessage = CloneHttpRequestMessage(requestMessage);
                return await asyncHttpCall.Invoke(newRequestMessage, cancellationToken).ConfigureAwait(false);
            }));
        }