【问题标题】:C# Async MVC method returns ContentResult System.Threading.Tasks.Task`1[System.Web.Mvc.JsonResult]C# Async MVC 方法返回 ContentResult System.Threading.Tasks.Task`1[System.Web.Mvc.JsonResult]
【发布时间】:2013-11-23 06:55:10
【问题描述】:

我正在尝试将一些方法转换为异步,并从我正在修改的控制器中的一个简单示例开始:

public class MyAPIController : AsyncController
{
    public async Task<JsonResult> List()
    {
        return Json(123456, JsonRequestBehavior.AllowGet);
    }

    ...
}

当我测试方法而不是 Json 结果时,我得到了字符串值“System.Threading.Tasks.Task`1[System.Web.Mvc.JsonResult]”,我已经使用 Fiddler 和浏览进行了验证。

该项目已手动升级到 .NET45。搜索表明这可能是程序集版本不正确的问题,但检查项目文件和进程视图表明在运行时引用并加载了正确的类型。

有人对此有任何调试技巧吗?

谢谢。

【问题讨论】:

  • 显示调用您的List 方法的代码。另见Asynchronous programming with async and await
  • 我正在做的是浏览 url 和\或使用 Fiddler 来编写一个 GET 请求,我有一个测试项目,其中这种方法工作正常。据我了解,MVC async 仅在服务器上是异步的,因此无需在客户端上进行任何等待,因为它需要一个安静的 API。
  • 我通常返回 Json 作为来自客户端的 ajax 调用的结果。我不需要使用异步,我返回的是 ActionResult 而不是你所拥有的 (Task)。看看有没有帮助
  • 代码 sn-p 是我能得到的最简单的形式,并且仍然可以演示该问题。 List 方法需要并行执行一些 http web 请求,要求控制器方法是异步的。我知道这应该可行,因为我有一个更简单的测试项目,它确实返回了正确的 JSON 结果。

标签: c# asp.net-mvc asp.net-mvc-4 asynchronous asynccontroller


【解决方案1】:

在删除 90% 的代码以使其正常工作并逐渐将其重新添加直到失败后,事实证明正在使用自定义 ControllerActionInvoker。修复方法是将自定义调用程序更改为从 AsyncControllerActionInvoker 继承并覆盖 BeginInvokeAction 而不是 InvokeAction。 AsyncControllerActionInvoker 可以处理异步和同步方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2015-07-21
    • 1970-01-01
    • 2017-03-10
    • 2017-09-02
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多