Използвайте един 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.