wake-up-neo.net

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

Ich habe eine Teilansicht, die versucht, einen 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 wenn ich dann versuche es anzurufen

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

Ich erhalte die folgende Ausnahme

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

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

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

Warum bekomme ich diesen Fehler? Sollte es nicht funktionieren?

77
BrunoLM

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

Ein Kommentar zu Ausgabe 601 weist darauf hin, dass diese Funktionalität in MVC vNext (aka) hinzugefügt wurde. MVC6. Untergeordnete Aktionen scheinen durch ViewComponent ersetzt zu werden, das wie folgt asynchron aus einer Ansicht aufgerufen werden kann. 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, daher kann die Frage als beantwortet markiert werden

89
Xenolightning

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

siehe meine volle aswer hier

2
Herre Kuijpers