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



Answers

看看下面的文章跟踪和恢复ASP.NET中的大文件下载 ,它将提供更深入的内容,而不仅仅是打开流并删除所有位。

http协议支持远程字节请求和可恢复下载,许多流式客户端(如视频播放器或Adobe pdf)可以并且将尝试将这些内容组合起来,从而节省带宽并为用户提供更好的体验。

不是微不足道的,但是花时间好了。

Question

使用ASP.NET传输文件的最佳方法是什么?

似乎有各种方法,我目前在http处理程序中使用Response.TransmitFile()方法,该方法直接将文件发送到浏览器。 这用于各种事情,包括从Webroot外部发送FLV到嵌入式Flash视频播放器。

但是,这似乎不是一种可靠的方法。 特别是, Internet Explorer(7)存在一个奇怪的问题,浏览器只是在观看一两个视频后挂起。 单击任何链接等都没有任何效果,并且在网站上重新运行工作的唯一方法是关闭浏览器并重新打开它。

这种情况也会在其他浏览器中出现,但频率要低得多。 基于一些基本的测试,我怀疑这与文件流的方式有关...也许连接没有正确关闭,或者沿着这些线路。

在尝试了几个不同的东西之后,我发现以下方法对我有用:

Response.WriteFile(path);
Response.Flush();
Response.Close();
Response.End();

这解决了上述问题,观看视频不再导致Internet Explorer挂起。

但是,我的理解是Response.WriteFile()首先将文件加载到内存中,并且考虑到流式传输的某些文件可能非常大,这似乎不是一个理想的解决方案。

我很想知道其他开发人员如何在ASP.NET中传输大文件,特别是流式传输FLV视频文件。




在尝试了许多不同的组合之后,包括在各种答案中发布的代码,似乎在调用TransmitFile之前设置Response.Buffer = true,并且Web应用程序现在在Internet Explorer中响应更快。

在这种特殊情况下,SWF扩展也映射到ASP.NET,我们在Web应用程序中使用自定义处理程序从磁盘读取文件,然后使用Response.TransmitFile()将它们发送到浏览器。 我们有一个基于闪存的视频播放器来播放也是SWF的视频文件,我认为让所有这些活动通过处理程序而不进行缓冲是可能导致IE中发生奇怪事情的原因。




Related