Gebruik één CancellationToken voor .NET HttpClient-headers en -body
Geef het CancellationToken van een aanvraag door aan zowel het opzetten van de HttpClient-respons als het lezen van de body, in plaats van alleen de wachttijd van de aanroeper te meten.
Een stopwatch kan stoppen met wachten terwijl het HTTP-verzoek doorloopt. Geef de annulering aan de bewerking zelf wanneer een proxy-poging een bedoeld tijdsbudget heeft.
Voor een moderne .NET-toepassing met een bestaande proxy-geconfigureerde 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);
Hetzelfde budget begint vóór het opzetten en blijft actief terwijl de body wordt gelezen. ResponseHeadersRead geeft de besturing terug na de headers, dus de eigen time-out van HttpClient bepaalt op zichzelf niet het latere leesbudget voor de body.
Houd annulering gescheiden van HTTP-status en transportfouten. Een OperationCanceledException kan van het meegegeven token of van een andere geconfigureerde time-out komen; onderzoek de betreffende annuleringsbron in plaats van elke fout als een dode proxy te melden.
Hergebruik de client die deze proxy-route bezit. Een poging annuleren betekent niet dat voor elk later verzoek de hele verbindingspool opnieuw moet worden opgebouwd.
Het voorbeeld buffert een eindige responsbody. Een streaming-download moet het token door de stream-kopieerlus doorgeven en de respons op elk uitgangspad vrijgeven.
Annulering drukt een beleid voor de bewerking uit, geen exacte klokbelofte voor elke onderliggende platformactie. Vervang het niet door een eindeloze polling-lus op Task.IsCompleted.