Reputation: 14100
Goal:
If you have tried the third time and it is not a success. Then you want to use another method.
I would like to to prevent displaying a error message webpage.
Problem:
is it possible to enter a method that is similiar as catch method in WaitAndRetryAsync?
RetryPolicy<HttpResponseMesssage> httpWaitAndRetryPolicy = Policy
.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.WaitAndRetryAsync
(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2. retryAttempt)/2));
Thank you!
Upvotes: 1
Views: 407
Reputation: 5042
You can use ExecuteAsync
on your policy and then use ContinueWith
to handle final response like this:
RetryPolicy<HttpResponseMessage>
.Handle<HttpRequestException>()
.Or<TaskCanceledException>()
.WaitAndRetryAsync
(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) / 2))
.ExecuteAsync(() =>
{
//do stuff that you want retry
}).ContinueWith(x =>
{
if (x.Exception != null)
{
//means exception raised during execute and handle it
}
// return your HttpResponseMessage
}, scheduler: TaskScheduler.Default);
Following @TheodorZoulias's comment the best practice for use ContinueWith
is to explicit set TaskScheduler
to defualt, because ContinueWith
change the scheduler to Current
and maybe cause to deadlock.
Upvotes: 2
Reputation: 22819
First of all the WaitAndRetryAsync
returns an AsyncRetryPolicy<T>
, not a RetryPolicy<T>
, which means that your posted code does not compile.
In case of polly the definition of a policy and the execution of that policy are separated. So, first you define a policy (or a mixture of policies) and then execute it whenever it is needed.
AsyncRetryPolicy<HttpResponseMessage> retryInCaseOfNotSuccessResponsePolicy = Policy
.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.WaitAndRetryAsync
(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2.retryAttempt) / 2));
HttpResponseMessage serviceResponse = null;
try
{
serviceResponse = await retryInCaseOfNotSuccessResponsePolicy.ExecuteAsync(
async ct => await httpClient.GetAsync(resourceUri, ct), default);
}
catch (Exception ex)
when(ex is HttpRequestException || ex is OperationCanceledException)
{
//TODO: log
}
if (serviceResponse == null)
{
//TODO: log
}
Upvotes: 0