net mvc framework example con asp application and c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

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