53

ho una vista parziale che cerca di recuperare un IEnumerable<Post> dal database utilizzando asincrona ...Async PartialView cause "HttpServerUtility.Execute bloccato ..." eccezione

Metodo

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 poi se provo a chiamarlo

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

ottengo la seguente eccezione

HttpServerUtility.Execute bloccata in attesa di un'operazione asincrona per completare.

Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

Dettagli eccezione: System.InvalidOperationException: HttpServerUtility.Execute bloccato durante l'attesa del completamento di un'operazione asincrona.

Perché ottengo questo errore? Non dovrebbe funzionare?

risposta

69

Le azioni figlio devono essere richiamate in modo sincrono. Issue 601 Inoltre non sono a conoscenza di aggiornamenti recenti alle attuali librerie MVC che consentono questa funzionalità.

Un commento su Issue 601, suggerisce che questa funzionalità venga aggiunta in MVC vNext, ovvero. MVC6. Le azioni secondarie sembrano essere sostituite con ViewComponent che può essere richiamato in modo asincrono da una vista come di seguito. esempi completi here e here

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

Per ulteriori informazioni su MVC6 controllare, http://www.asp.net/vnext/overview/aspnet-vnext/overview

Nota: Questa risposta è solo una formalità, quindi la domanda può essere contrassegnato come risposta