ASP.NET MVC ExecuteResult 与 ActionResult

ASP.NET MVC ExecuteResult vs ActionResult

我看到它曾经将 headers 添加到响应中,然后 return 用于流式传输的文件。

public override void ExecuteResult(ControllerContext context)
{
    ...
        response.AddHeader("Accept-Ranges", "bytes");
        response.AddHeader("Content-Length", responseLength.ToString());
        response.Cache.SetCacheability(HttpCacheability.Public); //required for etag output
        response.Cache.SetETag(etag); //required for IE9 resumable downloads
        response.ContentType = blockBlob.Properties.ContentType;

        blockBlob.DownloadRangeToStream(response.OutputStream, startIndex, responseLength);
}

使用 ExecuteResultActionResult 有何区别?如何使其异步?

ExecuteResultActionResult 上的抽象方法。 ActionResult 是从 ASP.NET MVC 控制器返回的任何结果的基础 class,除了 C# 中的内置数据类型。

如果您正在实施 ExecuteResult 它可能是结果的自定义实施。

这在 this documentation pageActionResult.ExecuteResult 文档中进行了解释,其中说明如下:

(Method ExecuteResult) Enables processing of the result of an action method by a custom type that inherits from the ActionResult class.

ExecuteResultActionResult唯一的抽象方法。 MVC 框架在操作方法 returns 之后执行此方法,以便向浏览器生成输出。

namespace System.Web.Mvc
{
    public abstract class ActionResult
    {
        public abstract void ExecuteResult(ControllerContext context);
    }
}

因此,两者之间确实没有区别 - 返回任何 ActionResult subclass 告诉 MVC 框架在 class 上执行 ExecuteResult 方法。

如果使用 MVC 5,则无法 运行 异步。但是,MVC Core ActionResult class 包含一个 ExecuteResultAsync 方法。