【问题标题】:Cannot send the same request message multiple times using Func<HttpRequestMessage>无法使用 Func<HttpRequestMessage> 多次发送相同的请求消息
【发布时间】:2019-10-20 06:55:22
【问题描述】:

我们的 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;
        }
    }
}

据我了解,Func&lt;HttpRequestMessage&gt; 允许它创建 HttpRequestMessage 的新实例。比如对于这行代码

return await ExecuteSingleAsync(requestMessage(), client);

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

【问题讨论】:

    标签: c# api asp.net-core asp.net-core-webapi


    【解决方案1】:

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

    不是这样的——你提交的Func是() =&gt; httpRequestMessage,它总是返回同一个实例。

    试试这个:

    _retryHttpRequest.ExecuteAsync(() => ConstructHttpRequestForBatchUpdate(batchRequest, client, requestUri), client, maxRetryValue);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      相关资源
      最近更新 更多