Používejte jeden CancellationToken pro hlavičky i tělo .NET HttpClient
Předávejte CancellationToken požadavku jak do nastavení odpovědi HttpClient, tak do čtení těla, místo abyste měřili jen čekání volajícího.
Stopky mohou přestat čekat, zatímco HTTP požadavek pokračuje. Zajistěte zrušení samotné operaci, když má pokus přes proxy zamýšlený rozpočet.
Pro moderní aplikaci .NET s existujícím HttpClient nakonfigurovaným pro proxy:
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);
Stejný rozpočet začíná před nastavením a zůstává aktivní během čtení těla. ResponseHeadersRead vrací řízení po hlavičkách, takže vlastní časový limit dokončení HttpClient sám o sobě neurčuje pozdější rozpočet pro čtení těla.
Držte zrušení oddělené od stavu HTTP a přenosových chyb. OperationCanceledException může pocházet z předaného tokenu nebo z jiného nakonfigurovaného časového limitu; zkontrolujte příslušný zdroj zrušení, místo abyste každé selhání hlásili jako mrtvou proxy.
Znovu používejte klienta, který tuto proxy trasu vlastní. Zrušení pokusu nemusí znamenat přestavbu celého fondu připojení pro každý další požadavek.
Příklad ukládá do vyrovnávací paměti konečné tělo odpovědi. Streamované stahování by mělo předat token svou smyčkou kopírování streamu a uvolnit odpověď na každé výstupní cestě.
Zrušení vyjadřuje politiku operace, nikoli přesný slib reálného času pro každou akci platformy. Vyhněte se jeho nahrazení nekonečnou smyčkou dotazování na Task.IsCompleted.