我有一个应用程序,旨在从我们的本地数据库流式传输视频。昨天我花了很多时间试图返回数据 aRangeFileContentResult
或RangeFileStreamResult
没有成功。
简而言之,当我将文件作为这两个结果中的任何一个返回时,我似乎无法正确播放视频(或根本无法播放)。
来自浏览器的请求使用以下标头发送:
Range: bytes=0-
提供的响应以这些标头为例:
Accept-Ranges: bytes
Content-Range: bytes 0-5103295/5103296
在网络流量方面,我得到了一系列 206 的部分结果,最后是 200(根据提琴手),这似乎是正确的。Chrome 的网络选项卡不同意这一点,并看到一个初始请求(我认为是握手总是 13 个字节),然后是几个状态为已取消或待处理的请求。据我了解,这或多或少是正确的,206 - 取消,206 - 取消等。但视频永远不会播放。
如果我将结果从我的控制器切换到 FileResult,视频播放和 Chrome、IE10 和 Firefox,并且似乎在下载结束之前开始播放(感觉有点像流媒体!虽然我怀疑不是)
但是对于范围结果,我在 chrome 或 IE 中一无所获,并且在 Firefox 中一滴就能下载整个视频。
据我了解,RangeFileContentResult
应该处理响应客户端并下载一系列字节(我的似乎没有这样做,它只是告诉它获取整个文件(如上面的响应所示))。客户应该对此做出回应,但它似乎没有这样做。
有人对这方面有任何想法吗?具体来说:
a) 应该RangeFileContentResult
将一系列字节发送回客户端?b)有什么方法可以显式控制从客户端请求的字节范围?c)在请求时,是否有任何原因或我做错了什么会导致浏览器根本不加载视频RangeFileContentResult
?
编辑:添加了一个图表来帮助描述我所看到的:
EDIT2:好的,所以情节变厚了。在使用 RangedFile gubbins 时,我们需要推出另一个系统测试版本,我在控制器操作中留下了“RangeFileContentResult”,如下所示:
private ActionResult RetrieveVideo(MediaItem media)
{
return new RangeFileContentResult(
media.Content,
media.MimeType,
media.Id.ToString(),
DateTime.Now);
}
相当奇怪的是,这现在似乎在我们的 Azure 系统测试环境上按预期工作,但在我的本地计算机上仍然没有。我想知道是否有一些基于 IIS 的东西在 Azures IIS8 上运行良好,但在我的本地 7.5 实例上却没有?