2017-02-25 55 views
1

我有一種將POST請求發送到服務器的方法。 該請求在HttpRequestMessage對象中定義。如何正確重試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不能發送一次不止,拋以下例外:

請求消息已發送。無法多次發送相同的請求消息。

我怎麼能做到上面的代碼試圖做什麼 - ,同時保持代碼簡單和優雅?

回答

0

嘗試使用某些東西like this answer複製/克隆請求消息。然後在下次重試時使用克隆的請求。類似於

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