【问题标题】:Async Await MVC Action returning Task instead of ActionResultAsync Await MVC Action 返回 Task 而不是 ActionResult
【发布时间】:2013-08-06 00:37:32
【问题描述】:

我有一个动作如下:

public async Task<ActionResult> Pair(string id)
    {
        try
        {
            DocuSignAPIManager docuSignAPIManager = new DocuSignAPIManager();

            DocuSignEsignatureAuthContainer authContainer = await docuSignAPIManager.Pair(User.Identity.Name, id).ConfigureAwait(false);

            DocuSignManager.Instance.Pair(User.Identity.Name, authContainer);
        }
        catch(Exception e)
        {
            ErrorManager.Instance.LogError(e);
        }

        return new HttpStatusCodeResult(200);
    }

当调用该操作时,所有逻辑都被执行,但是我收到的不是 HTTP 状态 200 代码,而是以下内容:

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

为了测试,我只是使用以下 URL 从 Web 浏览器调用操作:

http://localhost:20551/CharteredSurveyor/Pair/password

我真的不明白问题出在哪里 - 谁能帮忙?

【问题讨论】:

  • 我认为这只适用于 MVC4 - 你确定使用版本 4 吗?
  • Dean,是的,我肯定在运行 MVC 4 - 在具有相似签名的不同控制器上还有另一个操作 - 唯一真正的区别是它接受 FormCollection - 真的无法弄清楚.. .
  • 没有异步和任务是否可以工作?
  • 是的,它在没有异步和任务的情况下按预期工作
  • 您的目标是 .NET 4.5 吗?如果是这样,请上传一个最小的repro gist(包括csproj文件)。

标签: asp.net-mvc-4 async-await elmah


【解决方案1】:

来自 ELMAH 的 ErrorHandlingControllerFactory 返回一个自定义操作调用程序,用于确保将其 HandleErrorWithElmahAttribute 应用于控制器。它从不提供异步操作调用程序,因此它不理解 async/await。

两种解决方法;

  1. 尝试升级到最新的 ELMAH - 它可能修复了异步/等待。
  2. 删除对ControllerBuilder.Current.SetControllerFactory(new ErrorHandlingControllerFactory()) 的调用,只需使用GlobalFilters.Filters.Add(new HandleErrorWithElmahAttribute());HandleErrorWithElmahAttribute 添加到全局过滤器中

干杯, 院长

【讨论】:

  • Dean,感谢您的反馈 - 我最终选择了选项 2 - 更少的代码,最终结果是相同的(至少在我的情况下)。
【解决方案2】:

这对我有用,

变化

public class authController : Controller

public class authController : AsyncController

我创建了包含导致该错误的异步操作的控制器类继承自 AsyncController 类而不是默认的 Controller 类

我发现answer here

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多