目前我有这个请求:
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...
});
但是这个方法也不起作用,因为Polly期望返回类型为
HttpStatusCode
。所以我的问题是:我该如何告诉Polly处理那些HttpStatusCode
,同时允许我返回类型T
?