Utiliser un seul CancellationToken pour les en-têtes et le corps de .NET HttpClient
Faites circuler le CancellationToken de la requête à la fois dans la préparation de la réponse HttpClient et dans la lecture du corps, au lieu de chronométrer seulement l'attente de l'appelant.
Un chronomètre peut cesser d'attendre alors que la requête HTTP continue. Fournissez l'annulation à l'opération elle-même lorsqu'une tentative via proxy dispose d'un budget prévu.
Pour une application .NET moderne dotée d'un HttpClient configuré pour proxy existant :
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);
Le même budget commence avant la préparation et reste actif pendant la lecture du corps. ResponseHeadersRead rend la main après les en-têtes, donc le délai d'expiration d'achèvement propre à HttpClient ne définit pas à lui seul le budget ultérieur de lecture du corps.
Gardez l'annulation distincte du statut HTTP et des erreurs de transport. Une OperationCanceledException peut provenir du jeton fourni ou d'un autre délai configuré ; examinez la source d'annulation applicable au lieu de signaler chaque échec comme un proxy mort.
Réutilisez le client propriétaire de cette route proxy. Annuler une tentative n'implique pas nécessairement de reconstruire tout un pool de connexions pour chaque requête ultérieure.
L'exemple met en mémoire tampon un corps de réponse fini. Un téléchargement en flux doit transmettre le jeton à sa boucle de copie de flux et libérer la réponse sur chaque chemin de sortie.
L'annulation exprime une politique d'opération, non une promesse exacte d'horloge murale pour chaque action sous-jacente de la plateforme. Évitez de la remplacer par une boucle d'interrogation sans fin sur Task.IsCompleted.