Async PartialView powoduje wyjątek „HttpServerUtility.Execute zablokowany…”

85

Mam częściowy widok, który próbuje pobrać IEnumerable<Post>z bazy danych przy użyciu async ...

metoda

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

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

Częściowy widok

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

A potem, jeśli spróbuję to nazwać

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

Mam następujący wyjątek

HttpServerUtility.Execute zablokowane podczas oczekiwania na zakończenie operacji asynchronicznej.

Opis: wystąpił nieobsługiwany wyjątek podczas wykonywania bieżącego żądania WWW. Zapoznaj się ze śladami stosu, aby uzyskać więcej informacji o błędzie i miejscu jego powstania w kodzie.

Szczegóły wyjątku: System.InvalidOperationException: HttpServerUtility.Execute zablokowane podczas oczekiwania na zakończenie operacji asynchronicznej.

Dlaczego otrzymuję ten błąd? Czy to nie powinno działać?

BrunoLM
źródło

Odpowiedzi:

97

Akcje podrzędne muszą być wywoływane synchronicznie. Wydanie 601 Nie wiem również o żadnych najnowszych aktualizacjach obecnych bibliotek MVC, które umożliwiają taką funkcjonalność.

Komentarz do wydania 601, wskazówki dotyczące dodania tej funkcji w MVC vNext, aka. MVC6. Akcje podrzędne wyglądają na zastąpione, ViewComponentktórymi można wywoływać asynchronicznie z widoku, jak poniżej. Pełne przykłady tutaj i tutaj

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

Więcej informacji na temat MVC6 można znaleźć pod adresem http://www.asp.net/vnext/overview/aspnet-vnext/overview

Uwaga: ta odpowiedź to tylko formalność, więc pytanie można oznaczyć jako udzielone

Xenolightning
źródło
link 601 jest już nieaktualny
Serge
6

Obejściem tego problemu jest synchronizacja metody zgodnie z wymaganiami MVC, wyczyszczenie SynchronizationContext, wywołanie metody asynchronicznej i oczekiwanie na wynik, a następnie przywrócenie kontekstu.

zobacz moją pełną odpowiedź tutaj

Herre Kuijpers
źródło
3
(Wydaje się, że ten post nie zapewnia dobrej odpowiedzi na pytanie. Zmień odpowiedź lub po prostu opublikuj ją jako komentarz do pytania).
sɐunıɔ ןɐ qɐp