Cancelar una solicitud de .NET HttpClient a través de un proxy con un token de plazo
Cancele la propia operación de red cuando vence el plazo del proxy, en lugar de agotar solo la espera del llamador.
Pase el plazo a la operación que puede cancelar el trabajo de red. Para un .NET HttpClient existente configurado con proxy:
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
using var response = await client.GetAsync(uri, deadline.Token);La aplicación proporciona client y uri. Esta sobrecarga recibe el token de cancelación; un tiempo de espera en torno a la espera de su tarea solo limitaría la espera de ese llamador. Sondear un indicador de finalización tiene el mismo problema: el llamador puede irse mientras los sockets y los trabajadores siguen ocupados.
La cancelación sigue la implementación del cliente y su ruta de limpieza. No promete que cada acción de nivel inferior se detenga en una instrucción exacta. Deje que esa ruta termine y libere los recursos que posee la operación. Incluya en el diseño la lectura del cuerpo controlada por separado; para una operación .NET ResponseHeadersRead moderna, pase el mismo token a través de la lectura del cuerpo. Otros clientes ofrecen sus propias interfaces de cancelación, aborto y limpieza.
Un reintento necesita un resultado para el intento anterior. Conserve su identificador y el proxy seleccionado, solicite la cancelación cuando sea necesario y evite perder la tarea mientras inicia sustitutos indefinidamente. De lo contrario, un extremo lento puede acumular trabajo más rápido de lo que la aplicación lo libera.
El resultado remoto necesita un tratamiento aparte. Es posible que el destino ya haya recibido un envío cuando se produce la cancelación. Use la política de recuperación o de idempotencia de la aplicación; detener el trabajo local no deshace una acción remota.