【问题标题】:return 404 from Async Task从异步任务返回 404
【发布时间】:2016-08-27 05:00:36
【问题描述】:

我的 mvc 控制器中有这个方法:

public ActionResult BlaBla()
{
    if (!ModelState.IsValid)
        return new HttpNotFoundResult();

    // ...
}

我想创建它的异步版本。所以,我想像这样更改代码:

public async Task<ActionResult> BlaBla()
{
    if (!ModelState.IsValid)
        return new HttpNotFoundResult(); // Compiling error: this line is not working

    // ...
}

我的问题是,当使用async Task&lt;...&gt; 样式时,如何从我的 mvc 控制器返回错误代码(404、500、...)?

【问题讨论】:

  • 其他错误码可以使用HttpStatusCodeResult(HttpStatusCode code)基类。 HttpNotFoundResultHttpNotAuthorizedResult 的子类是两个最常见状态结果(分别为 404、401)的快捷方式。至于编译错误,这是因为您没有返回任务或等待任何其他方法调用,因此您的编译器没有自动生成 Task 返回类型。
  • @BerinLoritsch:在方法签名中没有async 的情况就是这样。但是,使用 async 编译器会补偿您,因此实际上没有必要返回 Task 实例。如果您实际上没有等待任何内容,您将收到编译器警告,但它仍会编译。
  • 引发的实际异常是什么?

标签: c# asp.net asp.net-mvc asynchronous async-await


【解决方案1】:

使用async 操作时必须有目的,对吧?通常,此目的是执行 I/O 绑定操作,例如通过您的异步服务公开的远程 TCP/HTTP 调用。

在此,典型的控制器操作如下所示:

public async Task<ActionResult> BlaBla()
{
    if (!ModelState.IsValid)
    {
        return new HttpNotFoundResult();
    }

    MyViewModel model = await myService.GetTheModel();
    return View(model);
}

在此示例中,由于您已经在方法中等待 async 操作,因此它可以正常编译。如果您没有任何async 操作,那么进行async 操作就没有什么意义了。它会造成更多的伤害然后帮助。所以现在你应该问自己的问题是:我真的有一些异步服务可以利用 I/O 完成端口来证明我需要使用异步操作吗?

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 2013-04-16
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多