Async PartialView verursacht die Ausnahme "HttpServerUtility.Execute blockiert ..."

84

Ich habe eine Teilansicht, die versucht, eine IEnumerable<Post>aus der Datenbank mit asynchronen ...

Methode

public static class PostService
{
    public static int PostsPerPage = 50;

    public static async Task<IEnumerable<Post>> GetRecentAsync(int page = 0)
    {
        return await entityFrameworkDbContext.Posts
            .ToListAsync();
    }
}

Teilansicht

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

Und dann, wenn ich versuche, es zu nennen

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

Ich bekomme die folgende Ausnahme

HttpServerUtility.Execute blockiert, während auf den Abschluss eines asynchronen Vorgangs gewartet wird.

Beschreibung: Während der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stapelverfolgung, um weitere Informationen über den Fehler und dessen Ursprung im Code zu erhalten.

Ausnahmedetails: System.InvalidOperationException: HttpServerUtility.Execute blockiert, während auf den Abschluss eines asynchronen Vorgangs gewartet wird.

Warum erhalte ich diesen Fehler? Sollte es nicht funktionieren?

BrunoLM
quelle

Antworten:

97

Untergeordnete Aktionen müssen synchron aufgerufen werden. Problem 601 Mir sind auch keine aktuellen Aktualisierungen der aktuellen MVC-Bibliotheken bekannt, die diese Funktionalität ermöglichen.

Ein Kommentar zu Problem 601 weist darauf hin, dass diese Funktionalität in MVC vNext, aka, hinzugefügt wurde. MVC6. Untergeordnete Aktionen scheinen ersetzt zu werden, ViewComponentdie in einer Ansicht wie unten asynchron aufgerufen werden können. Vollständige Beispiele hier und hier

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

Weitere Informationen zu MVC6 finden Sie unter http://www.asp.net/vnext/overview/aspnet-vnext/overview

Hinweis: Diese Antwort ist nur eine Formalität, sodass die Frage als beantwortet markiert werden kann

Xenolightning
quelle
Der 601 Link ist nicht mehr gültig
Serge
5

Eine Problemumgehung für dieses Problem besteht darin, die Methode gemäß den Anforderungen von MVC synchron zu machen, den SynchronizationContext zu löschen, die asynchrone Methode aufzurufen, auf das Ergebnis zu warten und dann den Kontext wiederherzustellen.

siehe meine volle Antwort hier

Herre Kuijpers
quelle
3
(Dieser Beitrag scheint keine qualitativ hochwertige Antwort auf die Frage zu bieten . Bitte bearbeiten Sie entweder Ihre Antwort oder veröffentlichen Sie sie einfach als Kommentar zur Frage.)
sɐunıɔ ןɐ qɐp