ASP.NET 如何将文件流式传输给用户
Posted
技术标签:
【中文标题】ASP.NET 如何将文件流式传输给用户【英文标题】:ASP.NET How To Stream File To User 【发布时间】:2010-10-18 16:32:23 【问题描述】:最初我试图弄清楚 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】:我不会打电话给Response.Close()
或Response.End()
。
Response.End()
将在此时停止页面执行/渲染。 Response.End()
后面的代码不会运行。响应在该点终止,没有进一步的输出添加到流中。
Response.Close()
类似于Response.End()
,但允许在调用后执行代码(但不能在页面响应中发送进一步的输出)。
Response.Flush()
会将所有剩余的响应项发送到页面。
来自IIS core team member:
Response.Close 向 客户端并在任何地方使用它 除了错误情况会导致 各种问题 - 例如,如果你 正在与足够多的客户交谈 延迟,复位数据包可能会导致 缓冲的任何其他响应数据 服务器、客户端或某处 之间被丢弃。
在这种特殊情况下,压缩 包括寻找共同的模式 在响应和一定数量的 响应必须由 压缩代码以增加 找到更长重复的机会 模式 - 这部分被缓冲 一旦您无法发送给客户 做 Response.Close()。
简而言之,不要使用 Response.Close()。
【讨论】:
@Mitch - 我正在稍微改变这个问题,以便更多地了解如何流式传输。我并没有真正看到这方面的标准,我想从那里开始。 那么在流式传输文件时不要调用 Response.Close() 或 Response.End() 吗?只需调用 Response.Flush() 将文件发送出缓冲区并结束该方法? 有趣的是,在 MasterPage 的上下文中,如果您不调用 Response.Close()(或邪恶的 Response.End()),MasterPage 页脚会在您的内容之后写入以上是关于ASP.NET 如何将文件流式传输给用户的主要内容,如果未能解决你的问题,请参考以下文章