Невозможно отправить одно и то же сообщение-запрос несколько раз, используя Func <HttpRequestMessage> - PullRequest
0 голосов
/ 04 июня 2019

В нашем 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<HttpRequestMessage> позволяет ему создать новый экземпляр HttpRequestMessage.Например, для этой строки кода

return await ExecuteSingleAsync(requestMessage(), client);

requestMessage() создает новый экземпляр для каждого цикла.Но если мое понимание верно, я не уверен, почему он все еще дает мне эту ошибку при отправке того же запроса.

1 Ответ

4 голосов
/ 04 июня 2019

requestMessage() создает новый экземпляр для каждого цикла.

Это не так - передаваемый вами Func равен () => httpRequestMessage, который всегда возвращает один и тот же экземпляр.

Попробуйте вместо этого:

_retryHttpRequest.ExecuteAsync(() => ConstructHttpRequestForBatchUpdate(batchRequest, client, requestUri), client, maxRetryValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...