Behavior de Timeout
El behavior de timeout integrado cancela solicitudes que excedan un límite de tiempo configurado.
Configuración
// Program.cs
builder.Services.AddTimeoutBehavior();
nota
AddTimeoutBehavior() es una extensión de IServiceCollection, no de ValiMediatorConfiguration.
Marcar una Solicitud con Timeout
public record GetExternalDataQuery(string Endpoint)
: IRequest<Result<string>>, IHasTimeout
{
// Timeout en milisegundos
public int TimeoutMs => 3000; // 3 segundos
}
Comportamiento de Excepción
Cuando el timeout expira, el behavior lanza una TimeoutException:
try
{
var result = await _mediator.Send(new GetExternalDataQuery("https://slow-api.com/data"));
}
catch (TimeoutException ex)
{
Console.WriteLine($"La solicitud agotó el tiempo: {ex.Message}");
}
aviso
El behavior de timeout lanza TimeoutException, no OperationCanceledException. Asegúrate de que tus bloques catch manejen el tipo correcto de excepción.
Cómo Funciona
- Crea un
CancellationTokenSourcecon la duración del timeout - Lo vincula con el
CancellationTokenentrante víaCreateLinkedTokenSource - Pasa el token vinculado al siguiente handler en el pipeline
- Si el token se activa antes de completar, el handler observa la cancelación
- Si el handler lanza
OperationCanceledExceptiony el timeout disparó, lo envuelve comoTimeoutException