目前我有这个要求:
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
s 并且仍然允许我返回 type T
?