c# - Filtro de acción asíncrono en MVC 4
asp.net-mvc async-await (2)
Tengo un filtro de acción que, cuando se usa en ciertas condiciones específicas, tiene que realizar una llamada de servicio web para garantizar que el estado actual sea válido. Inicialmente, parecía un candidato ideal para async / await, pero me he encontrado con un problema:
Supongamos una solicitud para: / Test / FilteredAction
- MyCustomActionFilter comienza a ejecutarse
- Se llega a la primera declaración de "espera"
- TestController.FilteredAction comienza a ejecutarse
- MyCustomActionFilter reanuda la ejecución
Tradicionalmente, esperaría que el filtro de acción reanudara la ejecución y luego se completara antes de que la acción del controlador comience a ejecutarse, pero esto no sucede.
Ahora asumo que esto es porque estoy usando:
public class MyCustomActionFilter : ActionFilterAttribute
{
public override **async** void OnActionExecuting(FilterContext context)
{
var foo = await WebServiceCall();
}
}
Así que creo que mi pregunta es: ¿existe una clase de filtro de acción compatible con asincronización integrada en MVC 4, o debería simplemente bloquear las llamadas aquí?
MVC no tiene un filtro de acción compatible con async
(pero WebAPI sí tiene uno ).
Por ahora, te recomiendo que uses llamadas de bloqueo en OnActionExecuting
. Esperemos que MVC tenga una mejor historia en el futuro.
Actualización: puede votar aquí para que el equipo MVC agregue filtros async
.
No, no hay un filtro asíncrono para MVC, pero es factible.
Los filtros ASP.NET MVC se basan en el concepto de ordenarse, un filtro está garantizado (si se especifica. Consulte la propiedad Order
en la interfaz IMvcFilter
) para ejecutar En un orden determinado, si se especifica.
Los problemas que deben abordarse a la luz de esto son:
Para los filtros existentes que no son asincrónicos (al menos no implementados de esa manera porque no hay otra manera), ¿obtienen su propia tarea o continúan con la anterior? Es una pregunta importante para responder, ya que hay que sopesar el beneficio de no continuar el siguiente filtro en otro subproceso y mantenerlo mientras otras solicitudes podrían usarlo.
Para los filtros que tienen el mismo orden especificado, ¿se ejecutan en paralelo o uno después del otro? Hacer el método asincrónico abre aún más esta posibilidad (aunque podría haberse hecho antes con una firma que no es asincrónica) y es definitivamente un cambio arquitectónico que podría tener un impacto en el rendimiento y el resultado esperado. La respuesta aquí no es tan simple y debería basarse en las pruebas y la compatibilidad con versiones anteriores.