【问题标题】:Wrapped ASP.NET MVC Controller does not support Async action method包装的 ASP.NET MVC 控制器不支持异步操作方法
【发布时间】:2015-12-20 08:55:54
【问题描述】:

我正在开发一个 ASP.Net MVC 4 项目。该项目中的所有控制器都包装在一个自定义控制器中,如下所示:

public abstract class BaseController : Controller{

    protected override void OnActionExecuted(ActionExecutedContext filterContext){

    }

    protected override IActionInvoker CreateActionInvoker(){
    return new WebControllerActionInvoker();
    }
}

一切正常。但是当我想在异步操作方法中使用异步修饰符时,操作方法无法正常工作并返回此消息 在视图中

System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult]

现在我应该怎么做才能解决这个问题?

编辑:动作方法示例

public async Task<ActionResult> Details(string id) { 
var user = await userService.FindByIdAsync(id); 
return View(user);
}

【问题讨论】:

  • “在异步方法中使用异步修饰符”是什么意思?
  • 赞这个public async Task&lt;ActionResult&gt; Index()
  • 请您提供操作代码示例。确保您使用的是await
  • public async Task&lt;ActionResult&gt; Details(string id) { var user = await userService.FindByIdAsync(id); return View(user);}
  • @codeWorm,我觉得动作没问题。你确定你没有覆盖BaseController 中的默认执行行为吗? System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] 很可能意味着该任务未被等待。

标签: c# asp.net-mvc asynchronous


【解决方案1】:

您应该从 AsyncController 派生以使其正常工作:

不是从 Controller 派生控制器,而是从 异步控制器。从 AsyncController 派生的控制器启用 ASP.NET 来处理异步请求,它们仍然可以服务 同步动作方法。

Controller 默认无法处理异步操作。

编辑:

由于上述方法适用于 .NET 4,并且似乎已被弃用,您可以找到另一种方法 here

【讨论】:

  • 这在 mvc 4 中不起作用。看看这个link
  • official documentation 表示不同:结合 .NET 4.5 的控制器类使您能够编写返回 Task 类型对象的异步操作方法。
  • @ieaglle 是的,这是创建异步方法的新的、更简单的方法。
  • @Kamo 当我使用 Controller 类时,相关视图会正确显示,但是当我使用 BaseController 时,视图只会显示类似 System.Threading.Tasks.Task`1[System.Web. Mvc.ActionResult]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多