c# - example - mvc 5 entity framework relationships
Async PartialView causa la excepción "HttpServerUtility.Execute blocked..." (2)
Tengo una vista parcial que intenta recuperar un IEnumerable<Post>
de la base de datos usando async ...
Método
public static class PostService
{
public static int PostsPerPage = 50;
public static async Task<IEnumerable<Post>> GetRecentAsync(int page = 0)
{
return await entityFrameworkDbContext.Posts
.ToListAsync();
}
}
Vista parcial
public async Task<ActionResult> Recent(int page = 0)
{
return PartialView(await PostService.GetRecentAsync(page));
}
Y luego si trato de llamarlo
@Html.Action("Recent", "Post")
Obtengo la siguiente excepción
HttpServerUtility.Execute bloqueó mientras esperaba que se completara una operación asincrónica.
Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.
Detalles de la excepción: System.InvalidOperationException: HttpServerUtility.Execute bloqueó mientras esperaba que se completara una operación asincrónica.
¿Por qué obtengo este error? ¿No debería funcionar?
Las acciones secundarias deben invocarse de forma síncrona. Problema 601 Tampoco estoy al tanto de ninguna actualización reciente de las bibliotecas MVC actuales que permitan esta funcionalidad.
Un comentario en el Issue 601, insinúa que esta funcionalidad se agrega en MVC vNext, aka. MVC6. Las acciones ViewComponent
parecen sustituirse por ViewComponent
que se puede invocar de forma asincrónica desde una vista, como se muestra a continuación. Ejemplos completos here y here
<div>
@await Component.InvokeAsync("YourComponent")
</div>
Para más información sobre MVC6 echa un vistazo, http://www.asp.net/vnext/overview/aspnet-vnext/overview
Nota: Esta respuesta es solo una formalidad, por lo que la pregunta puede marcarse como respondida
Una solución para este problema es hacer que el método sea sincrónico según lo requiera MVC, borrar el SynchronizationContext, llamar al método async y esperar el resultado, luego restaurar el contexto.
ver mi aswer completo here