使用Async Await时,MVC Action应该返回Task而不是ActionResult。

5

我有一个如下的操作:

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

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


Dean,是的我肯定在运行MVC 4 - 在另一个控制器上有一个类似签名的不同操作 - 唯一的真正区别是它接受一个FormCollection - 真的想不出来了... - markpirvine
不使用异步和任务,它能正常工作吗? - usr
是的,没有异步和任务也能正常工作。 - markpirvine
显然,一些额外的代码引起了问题。开始添加原始代码的部分,直到再次遇到错误。 - Panagiotis Kanavos
我注意到一些奇怪的事情,Pair方法对GetResponseAsync进行了等待调用 - 当那个点被触发时,我的Action中的代码开始执行 - 是否存在多重等待的问题? - markpirvine
显示剩余5条评论
2个回答

3
ELMAH中的ErrorHandlingControllerFactory返回一个自定义的操作调用程序,用于确保其HandleErrorWithElmahAttribute应用于控制器。它不会提供异步操作调用程序,因此无法理解async/await。
两种解决方法:
1. 尝试升级到最新的ELMAH - 它可能有async/await的修复。
2. 删除对ControllerBuilder.Current.SetControllerFactory(new ErrorHandlingControllerFactory())的调用,并使用GlobalFilters.Filters.Add(new HandleErrorWithElmahAttribute());将HandleErrorWithElmahAttribute添加到全局过滤器中。
祝好,
Dean

Dean,谢谢你的反馈 - 我最终选择了第二个选项 - 代码更少,而且最终结果是一样的(至少在我的情况下)。 - markpirvine

0

这对我有效,

public class authController : Controller

更改为

public class authController : AsyncController

我把那个出错的异步操作所在的控制器类从默认的 Controller 类改为 AsyncController 类。

我在这里找到了答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接