首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >异步阻塞导致"HttpServerUtility.Execute PartialView ...“异常

异步阻塞导致"HttpServerUtility.Execute PartialView ...“异常
EN

Stack Overflow用户
提问于 2014-06-06 09:18:10
回答 3查看 51K关注 0票数 87

我有一个局部视图,它试图使用异步从数据库中检索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();
    }
}

PartialView

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在等待异步操作完成时被阻塞。

为什么会出现这个错误?它不应该起作用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-11 12:19:06

必须同步调用子操作。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

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

票数 100
EN

Stack Overflow用户

发布于 2018-06-29 18:08:22

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

查看我的完整服务器here

票数 7
EN

Stack Overflow用户

发布于 2021-07-26 18:03:14

我有类似的问题,调用一些社交媒体网站的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>

希望这能帮助那些正在寻找更快解决这个问题的人。

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24072720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档