Политика тайм-аута Polly не активированаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Политика тайм-аута Polly не активирована

Сообщение Anonymous »


Я пытаюсь запустить политику тайм-аута 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 не активирует политику тайм-аута?

Добавлено позже

Я внедрил изменение, предложенное в ответе @PeterCsala, но проблема не устранена. Я добавил сверхупрощенную версию приведенного выше кода, чтобы использовать только политику таймаута с CancellationToken и поместил все это в новую конечную точку:

[HttpGet("v2/{delay}")] общедоступная асинхронная задача RunTestPolicy2 (задержка int, токен CancellationToken = по умолчанию) { HttpClient httpClient = новый HttpClient(); var url = $"http://localhost:5000/test/{delay}"; var timeoutPolicy = Policy.TimeoutAsync( 4, TimeoutStrategy.Optimistic, (_, _, _, _) => { Debug.WriteLine("Тайм-аут"); вернуть Задача.ЗавершеннаяЗадача; } ); пытаться { var ответ = ожидание timeoutPolicy.ExecuteAsync(ct => httpClient.GetAsync(url, токен), CancellationToken.None); return Ok(ожидайте ответа.Content.ReadAsStringAsync()); } поймать (Исключение ex) { вернуть BadRequest(ex.Message); } } Как и раньше, если delay = 20 (скажем), политика тайм-аута должна сработать, но этого не происходит. Как и раньше, ответом является «Успех», и в окно вывода ничего не записывается. Однако, если delay = 101 (на один больше, чем время ожидания HTTP по умолчанию), политика срабатывает, и в окне вывода выводится сообщение «Timeout».< /п> Излишне говорить, что я в полном замешательстве.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Политика тайм-аута Polly не активирована
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Политика тайм-аута Polly не активирована
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
    Anonymous » » в форуме C#
    0 Ответы
    61 Просмотры
    Последнее сообщение Anonymous
  • Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
    Anonymous » » в форуме C#
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Автоматический выключатель Polly Http отключается только при исключении тайм-аута
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»