【问题标题】:The asynchronous action method returns a Task, which cannot be executed synchronously异步action方法返回一个Task,不能同步执行
【发布时间】:2013-02-21 04:03:36
【问题描述】:

这段代码在我的本地机器上运行良好

public async Task<ActionResult> teststuff()
    {

        using (var client = new HttpClient())
        {

            var twitter = await client.GetStringAsync("http://www.twitter.com");
            Response.Write(twitter);
        }

        return View();
    }

但是当我上传到服务器时,我得到了错误响应

“/”应用程序中的服务器错误。

异步操作方法“teststuff”返回一个任务,它 不能同步执行。描述:一个未处理的 执行当前 Web 请求期间发生异常。 请查看堆栈跟踪以获取有关错误的更多信息和 它起源于代码的地方。

异常详细信息:System.InvalidOperationException:异步 操作方法“teststuff”返回一个无法执行的任务 同步。

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[InvalidOperationException:异步操作方法'teststuff' 返回一个Task,不能同步执行。]
System.Web.Mvc.Async.TaskAsyncActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) +125
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 参数)+39
System.Web.Mvc.c__DisplayClass13.b__10() +120 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func1 continuation) +637
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList
1 过滤器,ActionDescriptor actionDescriptor, IDictionary`2 参数)+307
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +688
NotFoundMvc.ActionInvokerWrapper.InvokeActionWith404Catch(ControllerContext 控制器上下文,字符串 actionName) +54
NotFoundMvc.ActionInvokerWrapper.InvokeAction(ControllerContext 控制器上下文,字符串动作名称)+19
System.Web.Mvc.c__DisplayClass1d.b__19() +40
System.Web.Mvc.Async.c__DisplayClass1.b__0() +15
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +15
System.Web.Mvc.c__DisplayClass8.b__3(IAsyncResult asyncResult) +42
System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +15
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

----------------------------------- --------------------------------- 版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.17929

我的服务器上缺少一些东西,但无法找出它是什么,任何帮助将不胜感激。

我已尝试在服务器上重新安装 .net framework 4.5,但没有效果。但是我确实在服务器上注意到它同时具有

Microsoft .NET Framework 4 多目标包和 Microsoft .NET Framework 4.5 多目标包

不确定我是否应该删除 4 个?

谢谢

【问题讨论】:

  • 您是否将/configuration/system.web/compilation@targetFramework 设置为4.5
  • 是的,我只是检查了一下,targetFramework 设置为 4.5

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


【解决方案1】:

为了使用 Ninject 将依赖项注入到 MVC 属性中,子类化 ControllerActionInvoker 后出现此错误。此页面描述了执行此操作的过程:http://codeclimber.net.nz/archive/2009/02/10/how-to-use-ninject-to-inject-dependencies-into-asp.net-mvc.aspx

我的控制器中有一些异步方法,当调用这些异步方法时出现此错误。事实证明,我不需要继承 ControllerActionInvoker,而是 System.Web.Mvc.Async.AsyncControllerActionInvoker

更改基类后,我的代码很满意,运行良好。

【讨论】:

  • 我刚才在使用 CastleWindsor 进行动作过滤器的 DI 的应用程序上遇到了同样的问题。
  • 天啊!!非常感谢!这对我在 CastleWindsor 也有用
【解决方案2】:

很奇怪,我刚刚删除了网站中的所有文件,然后重新发布了网站,一切正常。

我认为这可能是因为我最近将站点从 MVC3 站点升级到 MVC4,并且目录中的 MVC3 站点可能留下了一个奇怪的 DLL。

感谢斯蒂芬的建议,它让我想到了清理网站并重新升级它的想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多