sup*_*nja 1 c# api asp.net-core asp.net-core-webapi
我们的 API 具有调用另一个端点的重试逻辑。但它一直给我一个错误
请求消息已发送。无法多次发送相同的请求消息
这是我的代码
public async Task<object> GetResponse()
{
var httpRequestMessage = ConstructHttpRequestForBatchUpdate(batchRequest, client, requestUri);
HttpResponseMessage httpResponseMessage = await _retryHttpRequest.ExecuteAsync(() => httpRequestMessage, client, maxRetryValue);
}
private HttpRequestMessage ConstructHttpRequestForBatchUpdate(JArray batchRequest, HttpClient client, Uri requestUri)
{
var batchReqStr = JsonConvert.SerializeObject(batchRequest);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var httpRequestMessage = new HttpRequestMessage()
{
Content = new StringContent(batchReqStr, Encoding.UTF8, "application/json"),
Method = HttpMethod.Put,
RequestUri = requestUri
};
return httpRequestMessage;
}
public class RetryHttpRequest : IRetryHttpRequest
{
public async Task<HttpResponseMessage> ExecuteAsync(Func<HttpRequestMessage> requestMessage, HttpClient client, int maxTryValue)
{
var remainingTries = maxTryValue;
var exceptions = new List<Exception>();
do
{
--remainingTries;
try
{
return await ExecuteSingleAsync(requestMessage(), client);
}
catch (Exception e)
{
exceptions.Add(e);
}
}
while (remainingTries > 0);
throw new AggregateException(exceptions);
}
public async Task<HttpResponseMessage> ExecuteSingleAsync(HttpRequestMessage requestMessage, HttpClient client)
{
try
{
HttpResponseMessage httpResponseMessage = await client.SendAsync(requestMessage);
if (httpResponseMessage.IsSuccessStatusCode)
{
return httpResponseMessage;
}
else
{
var exception = new InvalidOperationException();
throw new Exception();
}
}
catch (HttpRequestException httpException)
{
throw httpException;
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我了解,Func<HttpRequestMessage>
允许它创建一个新的实例HttpRequestMessage
。例如,对于这行代码
return await ExecuteSingleAsync(requestMessage(), client);
Run Code Online (Sandbox Code Playgroud)
requestMessage()
正在为每个循环创建一个新实例。但如果我的理解是正确的,我不确定为什么它仍然给我发送相同请求的错误。
requestMessage()
正在为每个循环创建一个新实例。
情况并非如此 - 您提交的 Func 是() => httpRequestMessage
,它总是返回相同的实例。
试试这个:
_retryHttpRequest.ExecuteAsync(() => ConstructHttpRequestForBatchUpdate(batchRequest, client, requestUri), client, maxRetryValue);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2719 次 |
最近记录: |