Секундамер можа спыніць чаканне, пакуль 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.

Падобныя артыкулы