Cancelar um pedido .NET HttpClient através de um proxy com um token de prazo
Cancele a própria operação de rede quando o prazo do proxy expira, em vez de apenas terminar a espera do chamador.
Passe o prazo para a operação que pode cancelar o trabalho de rede. Para um .NET HttpClient existente configurado através de um proxy:
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
using var response = await client.GetAsync(uri, deadline.Token);A aplicação fornece client e uri. Esta sobrecarga recebe o token de cancelamento; um tempo limite em torno da espera da sua tarefa limitaria apenas a espera desse chamador. Sondar um sinalizador de conclusão tem o mesmo problema: o chamador pode sair enquanto os sockets e os workers permanecem ocupados.
O cancelamento segue a implementação do cliente e o caminho de limpeza. Não promete que cada ação de nível inferior pare numa instrução exata. Deixe esse caminho terminar e liberte os recursos que a operação possui. Inclua no design a leitura do corpo controlada separadamente; para uma operação .NET ResponseHeadersRead moderna, passe o mesmo token através da leitura do corpo. Outros clientes fornecem as suas próprias interfaces de cancelamento, aborto e limpeza.
Uma nova tentativa precisa de um resultado para a tentativa anterior. Guarde o seu identificador e o proxy escolhido, peça cancelamento quando necessário e evite perder a tarefa ao iniciar substitutos indefinidamente. Caso contrário, um endpoint lento pode acumular trabalho mais depressa do que a aplicação o liberta.
O resultado remoto precisa de tratamento separado. O destino pode já ter recebido um envio quando o cancelamento ocorre. Use a política de recuperação ou de idempotência da aplicação; parar o trabalho local não desfaz uma ação remota.