【问题标题】:Async PartialView causes "HttpServerUtility.Execute blocked..." exceptionAsync PartialView 导致“HttpServerUtility.Execute 被阻止...”异常
【发布时间】:2014-07-27 04:28:00
【问题描述】:

我有一个局部视图,它尝试使用异步从数据库中检索 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 在等待异步操作完成时被阻塞。

为什么会出现此错误?它不应该工作吗?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6


    【解决方案1】:

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

    关于问题 601 的评论,暗示此功能将添加到 MVC vNext 中,又名。 MVC6。子操作看起来被替换为ViewComponent,它可以从如下视图异步调用。完整示例 herehere

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

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

    注意:这个答案只是形式,所以问题可以标记为已回答

    【讨论】:

    • 601 链接不再有效
    【解决方案2】:

    解决这个问题的方法是按照 MVC 的要求使方法同步,清除 SynchronizationContext,调用 async 方法并等待结果,然后恢复上下文。

    查看我的完整回答here

    【讨论】:

    • (这篇文章似乎没有为问题提供quality answer。请编辑您的答案,或者将其作为对问题的评论发布)。
    【解决方案3】:

    我在调用某些社交媒体网站的 API 并获取我们最近的几篇帖子并将它们显示在我们其中一个网站的主页上时遇到了类似的问题。

    解决这个问题的方法是使用 JavaScript 从视图(或您希望显示的部分视图)中获取我想要在主页上显示的数据,然后使用 ID.innerHTML + = 将获取的数据挂钩到主页如以下代码所示

     <div id="ID"></div>
    
    <script>
        var ID = document.getElementById('twitter');
    
        var sendHttpRequest = (method, url) => {
            var promise = new Promise((resolve, reject) => {
                var xhr = new XMLHttpRequest();
    
                xhr.open(method, url);
    
                xhr.onload = () => {
                    resolve(xhr.response);
                };
    
                xhr.send();
            });
    
            return promise;
        };
    
        window.addEventListener('load', function () {
            sendHttpRequest('GET', '////////////// the URL for the View (Or Partial View) /////////').then((responseData) => {ID.innerHTML += responseData})
    
        })
    </script>
    

    希望这对正在寻找更快解决此问题的人有所帮助。

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2018-05-13
      • 2010-11-04
      • 2018-12-08
      • 2012-04-23
      • 2013-06-03
      相关资源
      最近更新 更多