如何正确重试HttpRequestMessage?

时间:2017-02-25 18:49:02

标签: c# asp.net .net http

我有一个方法可以向服务器发送POST个请求。 请求在HttpRequestMessage对象中定义。

然而,如果服务器返回一些可重试的错误,我想重试,如下面的代码所示:

using (var request = new HttpRequestMessage(HttpMethod.Post, _endpoint))
{
    var requestPayload = Serialize(ingestionRequest);
    request.Content = new StringContent(requestPayload, Encoding.UTF8, JsonContentType);

    await _retryPolicy.ExecuteAsync(async () =>
    {
        // ReSharper disable once AccessToDisposedClosure
        using (var response = await _httpClient.SendAsync(request))
        {
            if (!response.IsSuccessStatusCode)
            {
                throw new IngestionException(response.StatusCode, response.ReasonPhrase);
            }
        }
    });
}

事实证明HttpRequestMessage不能多次发送,抛出以下异常:

  

请求消息已发送。无法多次发送相同的请求消息。

我怎么能做上面代码尝试做的事情 - 同时保持代码简单优雅?

1 个答案:

答案 0 :(得分:1)

尝试使用like this answer内容复制/克隆请求消息。然后在下次重试时使用克隆的请求。像

这样的东西
if (!response.IsSuccessStatusCode)
{
  var oldRequest = request;
  request = request.Clone();
  oldRequest.Dispose();
  throw new IngestionException(response.StatusCode, response.ReasonPhrase);
}