异步PartialView导致“ HttpServerUtility.Execute被阻止…”异常


85

我有一个局部视图试图IEnumerable<Post>使用异步从数据库中检索一个...

方法

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

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

局部视图

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

然后,如果我尝试称呼它

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

我得到以下异常

HttpServerUtility.Execute在等待异步操作完成时被阻止。

说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.InvalidOperationException:HttpServerUtility.Execute在等待异步操作完成时被阻止。

为什么会出现此错误?不行吗

Answers:


97

子操作必须同步调用。问题601我也不知道允许该功能的当前MVC库的任何最新更新。

对问题601的评论暗示了在MVC vNext中又添加了此功能。MVC6。看起来可以替换子动作ViewComponent,可以从如下视图中异步调用子动作。此处此处的完整示例

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

有关MVC6的更多信息,请访问http://www.asp.net/vnext/overview/aspnet-vnext/overview

注意:此答案仅是形式,因此可以将问题标记为已回答


601链接不再有效
Serge

6

此问题的一种解决方法是使该方法按照MVC的要求进行同步,清除SynchronizationContext,调用async方法并等待结果,然后还原上下文。

在这里看到我的全部请求


3
(此帖子似乎无法为问题提供高质量的答案。请编辑您的答案,或仅将其发布为对问题的评论)。
sɐunıɔןɐqɐp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.