所以,这是概要...
我的 MVC 4 应用程序有一个主布局页面,其中包含一些动态信息,需要强类型化到特定域实体才能获取该信息。为了使我的文件更清晰,我已将键入的字段提取到部分 View 中。
为了获取我需要的实体并将其映射到部分的 View 模型,我有一个 LayoutController,其操作返回 Task<PartialViewResult>
。此操作使用服务层来创建 async
调用 Web API 项目 await
实体。它将该实体按摩到 View 模型中,然后返回 PartialView("_LayoutPartial", viewModel).
在 _Layout 页面中,通过以下方式调用部分:
@{Html.RenderAction("LayoutInfo", "Layout", new { /*entity primary key*/ });}
我已经单步执行了代码,它确实返回了正确的实体,但是在返回部分 View 任务后,我得到了每个人最喜欢的服务器错误页面,并出现以下错误:
HttpServerUtility.Execute blocked while waiting for an asynchronous operation to complete.
我已经进行了一些谷歌搜索和搜索,但不知道这实际上意味着什么。我的想法正确吗?
最佳答案
该错误消息意味着您正在尝试从同步方法中调用(并等待!)异步方法。在您的具体情况下,同步方法是 HtmlHelper.RenderAction,异步方法是您的任务返回操作方法。发生错误的原因是,编写异步任务返回方法的目的大概是为了避免阻塞线程,但 RenderAction 在任务完成之前无法返回,因此 RenderAction 在等待操作完成时最终会阻塞。
一种选择是使 RenderAction 调用的方法同步而不是异步,请记住这将继续阻塞原始线程。另一种选择是从原始操作方法中异步填充布局数据,然后通过 ViewData 将其传递到布局页面。
关于asp.net - _Layout 中强类型局部 View 的异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13057203/