一个HttpRequestMessage对象只能使用一次;尝试再次使用相同的对象将引发异常。我正在使用Polly重试一些请求,并且遇到了这个问题。我知道如何克隆一个请求,在SO上有很多例子,但是我无法弄清楚如何克隆一个请求并在Polly重试时发送该新请求。我该怎么做?
这是我的策略,供参考。这是一个Xamarin应用程序。如果网络出现故障,我希望重新尝试几次,并且如果响应未经授权,我希望使用保存的凭据重新进行身份验证,并再次尝试原始请求。
这是我的策略,供参考。这是一个Xamarin应用程序。如果网络出现故障,我希望重新尝试几次,并且如果响应未经授权,我希望使用保存的凭据重新进行身份验证,并再次尝试原始请求。
public static PolicyWrap<HttpResponseMessage> RetryPolicy
{
get => WaitAndRetryPolicy.WrapAsync(ReAuthPolicy);
}
private static IAsyncPolicy WaitAndRetryPolicy
{
get => Policy.Handle<WebException>().WaitAndRetryAsync(4, _ => TimeSpan.FromSeconds(2));
}
private static IAsyncPolicy<HttpResponseMessage> ReAuthPolicy
{
get => Policy.HandleResult<HttpResponseMessage>(x => x.StatusCode == HttpStatusCode.Unauthorized)
.RetryAsync((_, __) => CoreService.LogInWithSavedCredsAsync(true));
}
这种方法无法正常工作是因为 HttpRequestMessage
被重复使用了,但这正是我想要实现的:
var request = new HttpRequestMessage(HttpMethod.Post, "some_endpoint")
{
Content = new StringContent("some content")
};
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var policyResponse = await ConnectivityHelper.RetryPolicy
.ExecuteAndCaptureAsync(() => _client.SendAsync(request)).ConfigureAwait(false);
// handle outcome
DelegatingHandler
的工作原理。从我的理解来看,它本质上是HttpClient
的中间件,对吗?因此,我只需一次性配置整个过程并将其传递给HttpClient
构造函数,而不是每次手动调用我的 Polly 策略?这使事情变得更加容易。现在我的问题是如何将DelegatingHandler
方法与ExecuteAndCaptureAsync
的行为相结合。顺便说一下,这是一个 Xamarin 应用程序。 - vaindil