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 如何将文件流式传输给用户的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 中流式传输大文件上传

在 ASP.NET 中流式传输文件的最佳方式

在 ASP.NET 中上传流和播放视频

HTML5 视频 - 从 SQL 文件流中流式传输

使用 ASP.NET Core 3 流式传输视频

如何从 ASP.NET MVC 控制器操作流式传输 MP3