【问题标题】:ASP.NET MVC: file response streaming?ASP.NET MVC:文件响应流?
【发布时间】:2013-06-03 16:07:16
【问题描述】:

当我从 MVC 操作方法返回 FilePathResult 时,会发生以下哪种情况(如果重要,假设结果指向的文件非常大):

  1. 文件被完整加载到服务器的内存中,然后发送到客户端。
  2. 文件以某种方式流式传输到客户端,在任何时候都不会完全加载到服务器的内存中。
  3. 别的东西。

如果答案是 1,是否可以通过返回不同类型的结果来像 2 一样发送文件?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 streaming


    【解决方案1】:

    更新:FilePathResult 使用 response.TransmitFile,它“将指定的文件直接写入 HTTP 响应输出流,而不将其缓冲在内存中。”。 Here's the source code for MVC.

    您可以使用FileStreamResult 类将数据流回:

     return new FileStreamResult(stream, "application/pdf")
     {
         result.FileDownloadName = "somefile.pdf";
     };
    

    或者你可以像这样重定向到文件:

     return Redirect("somefile.pdf");
    

    【讨论】:

    • 我很确定 FilePathResult 不会进行重定向 - 正如 msdn 文档所说,它“将文件的内容发送到响应”。
    • 其实FileStreamResult 好像没有直接流式传输。它仍然将整个文件复制到内存中。
    • 在这种情况下使用 Response.BufferOutput = false; 会有所帮助。
    • 还要注意设置Response.BufferOutput = false;,当从控制器方法内部通过某种异步方法获取文件流时,会死锁。
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2020-01-25
    • 2014-06-29
    相关资源
    最近更新 更多