Повторное использование HttpRequestMessage в политиках повторных попыток Полли - PullRequest
0 голосов
/ 24 мая 2018

Объект HttpRequestMessage можно использовать только один раз;будущие попытки использовать тот же объект выдают исключение.Я использую Полли, чтобы повторить некоторые запросы и решаю эту проблему.Я знаю, как я могу клонировать запрос, существует множество примеров для SO, но я не могу понять, как клонировать запрос и отправлять этот новый запрос всякий раз, когда Полли повторяет попытку.Как я могу это сделать?

Это моя политика, для справки.Это приложение 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
...