Koristite jedan CancellationToken za zaglavlja i telo .NET HttpClient
Prenesite CancellationToken zahteva kroz pripremu odgovora HttpClient i kroz čitanje tela, umesto da merite samo čekanje pozivaoca.
Štoperica može prestati da čeka dok HTTP zahtev i dalje traje. Prepustite otkazivanje samoj operaciji kada pokušaj preko proksija ima zadati vremenski budžet.
Za modernu .NET aplikaciju sa postojećim HttpClient-om podešenim za proksi:
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);
Isti budžet počinje pre pripreme i ostaje aktivan dok se telo čita. ResponseHeadersRead vraća kontrolu posle zaglavlja, pa sopstveni tajmaut HttpClient-a sam po sebi ne određuje budžet kasnijeg čitanja tela.
Držite otkazivanje odvojeno od HTTP statusa i transportnih grešaka. OperationCanceledException može doći iz prosleđenog tokena ili iz drugog podešenog tajmauta; proverite odgovarajući izvor otkazivanja umesto da svaki neuspeh prijavite kao mrtav proksi.
Ponovo koristite klijenta koji poseduje ovu proksi rutu. Otkazivanje jednog pokušaja ne znači ponovno pravljenje celog pula veza za svaki sledeći zahtev.
Primer baferuje telo odgovora konačne veličine. Kod strimovanog preuzimanja token treba proslediti kroz petlju kopiranja strima i osloboditi odgovor na svakoj izlaznoj putanji.
Otkazivanje izražava politiku operacije, a ne tačno obećanje vremena za svaku radnju platforme. Ne zamenjujte ga beskonačnom petljom provere Task.IsCompleted.