Async PartialView causa a exceção “HttpServerUtility.Execute block…”


85

Tenho uma visão parcial que tenta recuperar um IEnumerable<Post>do banco de dados 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();
    }
}

PartialView

public async Task<ActionResult> Recent(int page = 0)
{
    return PartialView(await PostService.GetRecentAsync(page));
}

E então se eu tentar chamá-lo

@Html.Action("Recent", "Post")

Eu recebo a seguinte exceção

HttpServerUtility.Execute bloqueado enquanto aguarda a conclusão de uma operação assíncrona.

Descrição: Ocorreu uma exceção não tratada durante a execução da solicitação da web atual. Revise o rastreamento de pilha para obter mais informações sobre o erro e onde ele se originou no código.

Detalhes da exceção: System.InvalidOperationException: HttpServerUtility.Execute bloqueado enquanto aguarda a conclusão de uma operação assíncrona.

Por que recebo esse erro? Não deveria funcionar?

Respostas:


97

As ações filhas devem ser chamadas de forma síncrona. Problema 601 Eu também não estou ciente de quaisquer atualizações recentes para as bibliotecas MVC atuais que permitem esta funcionalidade.

Um comentário sobre o problema 601 sugere que essa funcionalidade está sendo adicionada no MVC vNext, também conhecido como. MVC6. As ações filhas parecem ser substituídas pelas ViewComponentquais podem ser invocadas de forma assíncrona a partir de uma visualização como abaixo. Exemplos completos aqui e aqui

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

Para obter mais informações sobre MVC6, verifique, http://www.asp.net/vnext/overview/aspnet-vnext/overview

Observação: esta resposta é apenas uma formalidade, então a pergunta pode ser marcada como respondida


o link 601 não é mais válido
Serge

6

Uma solução alternativa para esse problema é tornar o método síncrono conforme exigido pelo MVC, limpar o SynchronizationContext, chamar o método assíncrono e aguardar o resultado, em seguida, restaurar o contexto.

veja minha resposta completa aqui


3
(Esta postagem não parece fornecer uma resposta de qualidade para a pergunta. Edite sua resposta ou apenas poste como um comentário à pergunta).
sɐunıɔ ןɐ qɐp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.