无法使用 Func<HttpRequestMessage> 多次发送相同的请求消息

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()正在为每个循环创建一个新实例。但如果我的理解是正确的,我不确定为什么它仍然给我发送相同请求的错误。

nla*_*ker 5

requestMessage()正在为每个循环创建一个新实例。

情况并非如此 - 您提交的 Func 是() => httpRequestMessage,它总是返回相同的实例。

试试这个:

_retryHttpRequest.ExecuteAsync(() => ConstructHttpRequestForBatchUpdate(batchRequest, client, requestUri), client, maxRetryValue);
Run Code Online (Sandbox Code Playgroud)