【问题标题】:How to make simple async action method returning content return actual content and not type如何使返回内容的简单异步操作方法返回实际内容而不是类型
【发布时间】:2020-11-24 02:40:12
【问题描述】:

这是一个非常简单的 MVC 异步操作:

    [HttpPost]
    public async Task<ContentResult> Trial()
    {
        ContentResult contentResult = await new Task<ContentResult>(()=>new ContentResult{Content="Hi"});
        return contentResult;
    }

我希望此操作的帖子能够以“嗨”内容进行响应。但事实并非如此。它以内容“System.Threading.Tasks.Task`1[System.Web.Mvc.ContentResult]”响应。

以下是完整回复:

    HTTP/1.1 200 OK
    Cache-Control: no-cache, no-store
    Pragma: no-cache
    Content-Type: text/html; charset=utf-8
    Content-Encoding: gzip
    Expires: -1
    Vary: Accept-Encoding
    X-UA-Compatible: IE=Edge
    Date: Mon, 23 Nov 2020 17:02:37 GMT
    Content-Length: 166
    
    System.Threading.Tasks.Task`1[System.Web.Mvc.ContentResult]

希望了解原因以及如何使用异步函数按预期获取内容“嗨”。谢谢。

【问题讨论】:

  • 因为你正在创建一个Task对象,而不是执行任务的结果。
  • 尼尔明白了……你应该使用Task.Run而不是new Task
  • 如果您使用的是非常旧的 MVC 版本,则可能会发生这种情况。您必须(至少)在 .NET Framework 4.5 上运行 ASP.NET 4.5,Task-returning 操作方法才能工作。
  • 谢谢。 @StephenCleary 完全正确。这是一个仍然指向 MVC 4.0 版的旧项目。谢谢。 (Task.Runnew Task 的行为相同)。
  • @StephanG 如果您将 Stephen Cleary 的回复标记为答案,那就太好了。会帮助别人。

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


【解决方案1】:

如果您使用的是非常旧的 MVC 版本,则可能会发生这种情况。您必须(至少)在 .NET Framework 4.5 上运行 ASP.NET 4.5,才能使任务返回操作方法起作用。 Microsoft.Bcl.Async 对 ASP.NET 项目不起作用

如果您的 Web 服务器上有 .NET Framework 4.5 或更高版本,您可以将项目升级到 ASP.NET 4.5。升级后你must turn off "quirks mode" for async to work properly。我更喜欢通过setting httpRuntime.targetFramework in your web.config to 4.5(或您升级到的任何版本)来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2022-12-29
    • 2018-11-19
    • 2014-03-31
    • 2018-03-15
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多