Filtro de acción asíncrono en MVC 4

Tengo un filtro de acción que cuando se usa en ciertas condiciones específicas tiene que realizar una llamada al servicio web para garantizar que el estado actual sea válido. Al principio parecía un candidato ideal para async / await, pero me encontré con un inconveniente:

Asumir una solicitud para: / Probar / FiltradaAcción

  • MyCustomActionFilter comienza a ejecutarse
    • Se llega a la primera statement de “espera”
  • TestController.FilteredAction comienza a ejecutarse
  • MyCustomActionFilter reanuda la ejecución

Tradicionalmente, esperaría que el filtro de acción reanude la ejecución y luego se complete antes de que la acción del controlador comience a ejecutarse, pero esto no ocurre.

Ahora supongo 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 locking en OnActionExecuting . Con suerte, MVC tendrá una mejor historia en el futuro.

Actualización: puede votar aquí para que el equipo de MVC agregue filtros async .

No, no hay 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 tendría que basarse en pruebas y compatibilidad con versiones anteriores.