首页 > 解决方案 > 如何使返回内容的简单异步操作方法返回实际内容而不是类型

问题描述

这是一个非常简单的 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]

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

标签: c#asp.net-mvcasync-await

解决方案


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

如果您的 Web 服务器上有 .NET Framework 4.5 或更高版本,则可以将项目升级到 ASP.NET 4.5。升级后,您必须关闭“怪癖模式”async才能正常工作。我更喜欢通过设置httpRuntime.targetFramework您的web.configto4.5(或您升级到的任何版本)来做到这一点。


推荐阅读