Me siento cómodo con la ejecución de trabajo sincrónico antes de llamar al SendAsync() del manejador interno y ejecutar el trabajo sincrónico después de que el manejador interno se haya completado a través de una finalización. por ejemplo:¿Cómo debería hacer DelegatingHandler una llamada asincrónica (ASP.NET MVC Web API)?
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
// do some sync work before inner handler here
var sendTask = base.SendAsync(request, cancellationToken);
return sendTask.ContinueWith(
task => { // do some sync work afterwards here });
}
Sin embargo, ahora tienen que llamar a una operación obligado IO desde un controlador delegante. La operación de IO bound ya está envuelta como Task<bool>
. Necesito usar el resultado para determinar si continúo en el controlador interno.
Un ejemplo sería hacer una llamada de red para autorizar una solicitud. Tengo que hacer esto para integrarme con un sistema existente. En general, creo que hay escenarios válidos para este problema, y debería tener una solución viable.
¿Cuál es la forma correcta de implementar SendAsync en este caso, para que ejecute la tarea IO bound asincrónicamente y luego continúe ejecutando asincrónicamente el controlador interno?
El punto clave es que quiero estar seguro de que el hilo de solicitud no se deja bloqueado en ningún momento.
¿cómo se implementa 'Authorize'? ¿Has instanciado un nuevo 'HttpClient'? – JobaDiniz
La implementación de Authorize no es relevante aquí; es solo una función asíncrona que determina si la solicitud está permitida; cómo la implementa depende de usted.Uno podría, por ejemplo, hacer una verificación de la base de datos para ver si el usuario actual tiene acceso para hacer la solicitud actual en función de algunas reglas comerciales a medida. –
Me preguntaba si realiza otra solicitud de HTTP, eso es todo ... en mi caso tengo que hacer otra llamada http, antes de la actual, y me han instanciado otro 'HttpClient'. Me preguntaba si podría reutilizar el actual dentro del controlador, pero parece que no puedo. – JobaDiniz