Use un único CancellationToken para as cabeceiras e o corpo de .NET HttpClient
Leve o CancellationToken da solicitude tanto pola preparación da resposta de HttpClient como pola lectura do corpo, en lugar de medir só a espera do chamador.
Un cronómetro pode deixar de esperar mentres a solicitude HTTP continúa. Proporcione cancelación á propia operación cando un intento a través dun proxy teña un orzamento previsto.
Para unha aplicación .NET moderna cun HttpClient configurado para proxy existente:
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);
O mesmo orzamento comeza antes da preparación e permanece activo mentres se le o corpo. ResponseHeadersRead devolve o control despois das cabeceiras, polo que o tempo de espera de finalización propio de HttpClient non define por si só o orzamento posterior de lectura do corpo.
Manteña a cancelación separada do estado HTTP e dos erros de transporte. Unha OperationCanceledException pode provir do token subministrado ou doutro tempo de espera configurado; inspeccione a fonte de cancelación aplicable en vez de informar cada fallo como un proxy morto.
Reutilice o cliente que posúe esta ruta de proxy. Cancelar un intento non ten por que significar reconstruír todo un conxunto de conexións para cada solicitude posterior.
O exemplo almacena en búfer un corpo de resposta finito. Unha descarga en streaming debería pasar o token polo seu bucle de copia de fluxo e liberar a resposta en cada ruta de saída.
A cancelación expresa unha política de operación, non unha promesa exacta de reloxo de parede para cada acción subxacente da plataforma. Evite substituíla por un bucle de sondaxe sen fin sobre Task.IsCompleted.