В настоящее время у меня есть такой запрос:
await url
.SetQueryParams(queryString)
.SetClaimsToken()
.GetJsonAsync<T>()
Я хочу начать использовать Polly (https://github.com/App-vNext/Polly) теперь для обработки повторных попыток и повышения удобства работы пользователей. Например, не «зависает» от пользователя с первой попытки из-за плохого сетевого подключения. Это пример, который я пытался использовать:
int[] httpStatusCodesWorthRetrying = { 408, 500, 502, 503, 504 };
Policy
.Handle<HttpException>()
.OrResult<HttpResponse>(r => httpStatusCodesWorthRetrying.Contains(r.StatusCode))
.WaitAndRetryAsync(new[] {
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
})
.ExecuteAsync( await url... )
Но для этого требуется, чтобы HttpResponse
был возвращаемым типом. Как вы можете видеть из моего примера с Flurl, он возвращает T
, хотя это HttpResponse
. T
- это просто тип, используемый для десериализации StringContent
.
Этот первый пример вообще не работает, поскольку я использую его внутри PCL и не могу найти там ссылку на System.Web
. Итак, я попробовал это:
Policy
.HandleResult(HttpStatusCode.InternalServerError)
.OrResult(HttpStatusCode.BadGateway)
.OrResult(HttpStatusCode.BadRequest)
.WaitAndRetryAsync(new[] {
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
})
.ExecuteAsync(async () =>
{
await url...
});
Но и этот не работает, потому что Полли ожидает HttpStatusCode
в качестве возвращаемого типа. Итак, мой вопрос: как я могу сказать Polly обработать эти HttpStatusCode
и по-прежнему разрешить мой возврат типа T
?