Ваш тайм-аут
Как я могу видеть на основе вашего кода, у вас есть глобальный тайм-аут в 1 минуту на уровне HttpClient. Это вызовет TaskCanceledException
, хотя вы могли бы ожидать TimeoutException
.
Если вы wi sh для получения TimeoutException
, тогда вам нужно указать тайм-аут на основе запроса / уровня через свойство RequestTimeout
из HttpRequestMessage
. Для получения дополнительной информации проверьте следующую ссылку .
Ваш повтор
Ваш лог повторных попыток c определяет 3 (или 10) повторных попыток со штрафом в 5 секунд. 3 попытки означают 4 попытки, потому что есть начальный (0-й) запрос, который находится за пределами области повтора. Если это не удается, то первая попытка станет второй попыткой.
Таким образом, поток будет выглядеть так:
- Первоначальный запрос отправлен << 1-я попытка </li>
- Не удалось выполнить первоначальный запрос
- Retry logi c запущен
- выставлен штраф в 5 секунд
- 1st retry logi c срабатывает << 2nd попытка </li>
- Вторая попытка не удалась
- Повторная попытка c срабатывает
- выставлен штраф в 5 секунд
- Вторая попытка logi c срабатывает << 3-я попытка </li>
- ...
Если все это можно завершить менее чем за секунду, то HttpClient выдаст TaskcCanceledExpcetion
из-за глобального тайм-аута.
Политика тайм-аута Polly
Polly также поддерживает локальные и глобальные политики тайм-аута. Существует единственная политика тайм-аута , которую можно использовать обоими способами.
Она может действовать как локальный тайм-аут, если ваша политика тайм-аута заключена в повторную попытку: retryPolicy.WrapAsync(timeoutPolicy);
Он может действовать как глобальный тайм-аут, если ваша политика повтора заключена в тайм-аут: retryPolicy.WrapAsync(timeoutPolicy);
Конечно, у вас могут быть глобальные и локальные тайм-ауты одновременно: Policy.WrapAsync(globalTimeoutPolicy, retryPolicy, localTimeoutPolicy);
Я настоятельно рекомендую вам рассмотреть возможность использования тайм-аута Polly вместо тайм-аута HttpClient, чтобы иметь единое место, где вы определяете свою устойчивую стратегию.
Пожалуйста, имейте в виду, что политика тайм-аута будет вызывать TimeoutRejectedException
, если время ожидания истекло без ответа. Поскольку ваша повторная попытка обрабатывает всевозможные исключения (.OrHandle<Exception>()
), вам не нужно изменять политику повторных попыток.
Обработка ошибок временного сбоя Polly
Существует пакет nuget с именем Microsoft.Extensions.Http.Polly ( 1 ), определяющий несколько полезных утилит. Один из них - HttpPolicyExtensions.HandleTransientHttpError()
. Он ловит HttpRequestException
и проверяет, является ли код состояния ответа 5xx или 408 (RequestTimeout).
Возможно, стоит подумать об использовании и этого.
Политики отладки
Каждая из разных политик определяет обратный вызов, чтобы дать возможность понять, как они работают. В случае повторной попытки он называется onRetry
или onRetryAsync
для syn c или asyn c retry соответственно. Вы, указав в своем WaitAndRetryAsync
следующего делегата, можете получить действительно полезную информацию:
onRetryAsync: (exception, delay, times, context) => {
//TODO: logging
}