Async PartialView provoca la excepción "HttpServerUtility.Execute bloqueado ..."

85

Tengo una vista parcial que intenta recuperar una 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 bloqueado mientras espera que se complete 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 bloqueado mientras se espera que se complete una operación asincrónica.

¿Por qué recibo este error? ¿No debería funcionar?

BrunoLM
fuente

Respuestas:

97

Las acciones secundarias deben invocarse de forma sincrónica. Problema 601 Tampoco tengo conocimiento de ninguna actualización reciente de las bibliotecas MVC actuales que permitan esta funcionalidad.

Un comentario sobre el problema 601, sugiere que esta funcionalidad se agregará en MVC vNext, también conocido como. MVC6. Las acciones secundarias parecen ser reemplazadas por las ViewComponentque se pueden invocar de forma asincrónica desde una vista como se muestra a continuación. Ejemplos completos aquí y aquí

<div>
@await Component.InvokeAsync("YourComponent")
</div>

Para obtener más información sobre MVC6, consulte http://www.asp.net/vnext/overview/aspnet-vnext/overview

Nota: esta respuesta es solo una formalidad, por lo que la pregunta se puede marcar como respondida

Xenolightning
fuente
el enlace 601 ya no es válido
Serge
6

Una solución para este problema es sincronizar el método según lo requiera MVC, borrar SynchronizationContext, llamar al método async y esperar el resultado, luego restaurar el contexto.

mira mi respuesta completa aquí

Herre Kuijpers
fuente
3
(Esta publicación no parece proporcionar una respuesta de calidad a la pregunta. Edite su respuesta o simplemente publíquela como un comentario a la pregunta).
sɐunıɔ ןɐ qɐp