Политика тайм-аута Polly не активирована ⇐ C#
Политика тайм-аута Polly не активирована
Я пытаюсь запустить политику тайм-аута Polly, но она не работает, но когда я объединяю ее с политикой повтора, она работает нормально. Политики определены следующим образом: (Отказ от ответственности: это чистый тестовый код, не обращайте внимания на запахи кода)
var httpRetryPolicy = Policy.Handle() .OrResult(r => !r.IsSuccessStatusCode) .WaitAndRetryAsync( 5, retryAttempt => TimeSpan.FromSeconds(1), (_, _, retryAttempt, _) => Debug.WriteLine($"Повторная попытка ({retryAttempt})") ); var timeoutPolicy = Policy.TimeoutAsync( 4, TimeoutStrategy.Optimistic, (_, _, _, _) => { Debug.WriteLine("Тайм-аут"); вернуть Задача.ЗавершеннаяЗадача; } ); Конечная точка для теста политики/задержки в PollyTestController:
[HttpGet("{policyKey}/{delay}")] общедоступная асинхронная задача RunPolicyTest (строка policyKey, int задержка) { Политика AsyncPolicyWrap = null; если (policyKey == "Т") политика = Policy.WrapAsync(timeoutPolicy, Policy.NoOpAsync())); иначе if(policyKey == "TR") политика = Policy.WrapAsync(timeoutPolicy, httpRetryPolicy)); HttpClient httpClient = новый HttpClient(); var url = $"http://localhost:5000/test/{delay}"; пытаться { вар ответ = ждут policy.ExecuteAsync(() => httpClient.GetAsync(url)); return Ok(ожидайте ответа.Content.ReadAsStringAsync()); } поймать (Исключение ex) { вернуть BadRequest(ex.Message); } } И конечная точка теста в TestController:
[HttpGet("{delay}")] public IActionResult GetWithDelay (интервал задержки) { if (delay == 10) return NotFound("Не найден"); Thread.Sleep(задержка*1000); вернуть ОК("Успех"); } Сценарий 1: Вызов http://localhost:5000/pollytest/T/5: при этом будет выбрана политика «T» (тайм-аут) для выполнения вызова. на http://localhost:5000/test/6. Из приведенного выше кода ясно, что ответ будет задержан на 6 секунд, а поскольку таймаут в политике равен 4 секундам, должно быть выброшено TimeoutRejectedException. Но этого не происходит: запрос зависает ровно на 6 секунд, прежде чем вернуться с ответом «Успех». В окне вывода ничего не печатается.
Сценарий 2: Вызов http://localhost:5000/pollytest/TR/10: при этом будет выбрана политика «TR» (тайм-аут вокруг повторной попытки) для выполните вызов http://localhost:5000/test/10. Поскольку для задержки установлено значение 10, конечная точка вернет код 404, поэтому политика повторных попыток будет выполнять попытку 5 раз с задержкой в 1 секунду между каждой попыткой. Но на этот раз политика тайм-аута вступает в силу после четвертой попытки, пятая попытка никогда не происходит, в окне вывода отображается:
Повторная попытка (1) Повторная попытка (2) Повторная попытка (3) Повторная попытка (4) Тайм-аут и ответ: «Делегат, выполненный асинхронно через TimeoutPolicy, не завершился в течение тайм-аута».
Что мне здесь не хватает? Почему сценарий 1 не активирует политику тайм-аута?
Я пытаюсь запустить политику тайм-аута Polly, но она не работает, но когда я объединяю ее с политикой повтора, она работает нормально. Политики определены следующим образом: (Отказ от ответственности: это чистый тестовый код, не обращайте внимания на запахи кода)
var httpRetryPolicy = Policy.Handle() .OrResult(r => !r.IsSuccessStatusCode) .WaitAndRetryAsync( 5, retryAttempt => TimeSpan.FromSeconds(1), (_, _, retryAttempt, _) => Debug.WriteLine($"Повторная попытка ({retryAttempt})") ); var timeoutPolicy = Policy.TimeoutAsync( 4, TimeoutStrategy.Optimistic, (_, _, _, _) => { Debug.WriteLine("Тайм-аут"); вернуть Задача.ЗавершеннаяЗадача; } ); Конечная точка для теста политики/задержки в PollyTestController:
[HttpGet("{policyKey}/{delay}")] общедоступная асинхронная задача RunPolicyTest (строка policyKey, int задержка) { Политика AsyncPolicyWrap = null; если (policyKey == "Т") политика = Policy.WrapAsync(timeoutPolicy, Policy.NoOpAsync())); иначе if(policyKey == "TR") политика = Policy.WrapAsync(timeoutPolicy, httpRetryPolicy)); HttpClient httpClient = новый HttpClient(); var url = $"http://localhost:5000/test/{delay}"; пытаться { вар ответ = ждут policy.ExecuteAsync(() => httpClient.GetAsync(url)); return Ok(ожидайте ответа.Content.ReadAsStringAsync()); } поймать (Исключение ex) { вернуть BadRequest(ex.Message); } } И конечная точка теста в TestController:
[HttpGet("{delay}")] public IActionResult GetWithDelay (интервал задержки) { if (delay == 10) return NotFound("Не найден"); Thread.Sleep(задержка*1000); вернуть ОК("Успех"); } Сценарий 1: Вызов http://localhost:5000/pollytest/T/5: при этом будет выбрана политика «T» (тайм-аут) для выполнения вызова. на http://localhost:5000/test/6. Из приведенного выше кода ясно, что ответ будет задержан на 6 секунд, а поскольку таймаут в политике равен 4 секундам, должно быть выброшено TimeoutRejectedException. Но этого не происходит: запрос зависает ровно на 6 секунд, прежде чем вернуться с ответом «Успех». В окне вывода ничего не печатается.
Сценарий 2: Вызов http://localhost:5000/pollytest/TR/10: при этом будет выбрана политика «TR» (тайм-аут вокруг повторной попытки) для выполните вызов http://localhost:5000/test/10. Поскольку для задержки установлено значение 10, конечная точка вернет код 404, поэтому политика повторных попыток будет выполнять попытку 5 раз с задержкой в 1 секунду между каждой попыткой. Но на этот раз политика тайм-аута вступает в силу после четвертой попытки, пятая попытка никогда не происходит, в окне вывода отображается:
Повторная попытка (1) Повторная попытка (2) Повторная попытка (3) Повторная попытка (4) Тайм-аут и ответ: «Делегат, выполненный асинхронно через TimeoutPolicy, не завершился в течение тайм-аута».
Что мне здесь не хватает? Почему сценарий 1 не активирует политику тайм-аута?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
Anonymous » » в форуме C# - 0 Ответы
- 61 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
Anonymous » » в форуме C# - 0 Ответы
- 44 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Автоматический выключатель Polly Http отключается только при исключении тайм-аута
Anonymous » » в форуме C# - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-