Usare un unico CancellationToken per intestazioni e corpo di .NET HttpClient
Trasmetti il CancellationToken della richiesta sia nella preparazione della risposta di HttpClient sia nella lettura del corpo, invece di misurare solo l'attesa del chiamante.
Un cronometro può smettere di attendere mentre la richiesta HTTP continua. Fornisci l'annullamento all'operazione stessa quando un tentativo tramite proxy ha un budget previsto.
Per un'applicazione .NET moderna con un HttpClient configurato per proxy esistente:
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);
Lo stesso budget inizia prima della preparazione e resta attivo durante la lettura del corpo. ResponseHeadersRead restituisce il controllo dopo le intestazioni, quindi il timeout di completamento proprio di HttpClient non definisce da solo il successivo budget di lettura del corpo.
Mantieni l'annullamento distinto dallo stato HTTP e dagli errori di trasporto. Un OperationCanceledException può provenire dal token fornito o da un altro timeout configurato; esamina l'origine di annullamento applicabile invece di segnalare ogni errore come proxy morto.
Riutilizza il client che possiede questa rotta proxy. Annullare un tentativo non deve necessariamente significare ricostruire un intero pool di connessioni per ogni richiesta successiva.
L'esempio memorizza nel buffer un corpo di risposta finito. Un download in streaming dovrebbe passare il token attraverso il ciclo di copia dello stream e rilasciare la risposta su ogni percorso di uscita.
L'annullamento esprime una politica operativa, non una promessa esatta di orologio da parete per ogni azione sottostante della piattaforma. Evita di sostituirlo con un ciclo di polling senza fine su Task.IsCompleted.