ASP.NET如何将文件流式传输给用户

7

最初我试图弄清楚Response.Close和Response.End之间的区别,但是在进行更多的搜索和研究后,很明显我没有看到一种常见的方式将Byte[]发送回客户端。我会在下面留下代码示例,但我想知道业界对此的标准做法。

Byte[] myBytes = GetReportBytes();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AppendHeader("content-length", myBytes.Length.ToString());
HttpContext.Current.Response.AppendHeader("content-Disposition", "attachment;filename=" + this.ReportFileName + GetReportExtension());
HttpContext.Current.Response.ContentType = GetApplicationContentType();
HttpContext.Current.Response.BinaryWrite(myBytes);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.Close();
//CERT FIX
//HttpContext.Current.Response.End();
1个回答

18

我不会使用Response.Close()Response.End()

Response.End()将在该点停止页面执行/呈现。不会运行Response.End()之后的任何代码。响应在此时终止,没有进一步的输出添加到流中。

Response.Close()类似于Response.End(),但允许在调用它后执行代码(但不能在页面响应中发送更多输出)。

Response.Flush()将发送任何剩余的响应项到页面。

来自IIS核心团队成员

Response.Close向客户端发送复位数据包,并且在除错误条件外的任何情况下使用它都会导致各种问题-例如,如果您与具有足够延迟的客户端通信,则复位数据包可能会导致服务器,客户端或介于两者之间缓冲的任何其他响应数据被删除。

在这种特殊情况下,压缩涉及查找响应中的常见模式,并且必须通过压缩代码缓冲一定量的响应以增加发现较长重复模式的机会-缓冲的这部分在执行Response.Close()后无法发送到客户端。

简而言之,不要使用Response.Close()。


@Mitch - 我稍微修改了问题,更多地是关于如何进行流媒体的一般性问题。我并没有看到这方面的标准,希望从这里开始。 - RSolberg
4
在流传输文件时,不要调用Response.Close()或Response.End()?只需调用Response.Flush()将文件发送到缓冲区并结束方法即可? - StuperUser
2
有趣的是,在 MasterPage 的上下文中,如果您不调用 Response.Close()(或邪恶的 Response.End()),MasterPage 页脚会在您的内容之后被写入。 - Patrick from NDepend team

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接