Користете еден CancellationToken за .NET HttpClient заглавја и тело
Пренесете го CancellationToken на барањето низ поставувањето на одговорот на HttpClient и читањето на телото, наместо да го мерите само чекањето на повикувачот.
Стоперката може да престане да чека додека HTTP барањето продолжува. Обезбедете откажување на самата операција кога обидот преку прокси има предвиден буџет.
За современа .NET апликација со постоечки HttpClient конфигуриран со прокси:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(5));
using var response = await client.GetAsync(
targetUrl,
HttpCompletionOption.ResponseHeadersRead,
budget.Token);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync(budget.Token);
Истиот буџет започнува пред поставувањето и останува активен додека се чита телото. ResponseHeadersRead враќа контрола по заглавјата, па сопствениот тајмаут на HttpClient не го одредува сам буџетот за подоцнежно читање на телото.
Одвојте го откажувањето од HTTP статусот и транспортните грешки. OperationCanceledException може да дојде од доставениот токен или од друг конфигуриран тајмаут; проверете го соодветниот извор на откажување, наместо секој неуспех да го пријавувате како мртов прокси.
Користете го клиентот што го поседува оваа прокси рута. Откажувањето на еден обид не значи дека треба да се изгради цел нов базен на врски за секое следно барање.
Примерот го баферира телото на конечен одговор. При стриминг преземање, токенот треба да се пренесе низ циклусот за копирање и одговорот да се ослободи на секој излезен пат.
Откажувањето изразува политика на операцијата, а не точно ветување за вистинско време за секое дејство на платформата. Не го заменувајте со бесконечна циклус за проверка на Task.IsCompleted.