如何在ASP.NET MVC FileStreamResult中流式传输部分内容

11
我们正在使用FileStreamResult向基于Silverlight MediaElement的视频播放器提供视频数据。
public ActionResult Preview(Guid id) {
    return new FileStreamResult(
        Services.AssetStore.GetStream(id, ContentType.Preview),
        "application/octet-stream");
}

不幸的是,Silverlight视频播放器在开始播放之前会下载整个视频文件。这种行为是因为我们的Preview操作不支持下载部分内容。

(顺便说一句:如果文件托管在IIS虚拟目录中,我们可以在仍在下载视频时的任何位置开始播放。但出于安全和审计原因,我们不能提供直接下载链接,所以这不是一个选项。)

如何改进控制器操作以支持部分HTTP内容?

我假设我们首先要通知客户端我们支持它(通过向HEAD请求添加“Accept-Ranges:bytes”头),然后我们必须评估HTTP“Range”头并使用206响应代码流传输请求的文件范围。这是否适用于托管在IIS6上的ASP.NET MVC?是否已经有一些可用的代码?

另请参见:

3个回答

5

在CodePlex上有一个项目可以提供这种功能。

http://mediastreamingmvc.codeplex.com/

请看一下。它是专门为这种场景创建的,您希望拥有一个代表对虚拟资源的请求的操作,并在需要时返回部分内容,而无需开发人员做太多支持工作(一个动作过滤器和结果类型的选择)。


0
  1. 你必须亲自实现这个。是的,这将在IIS6上运行。
  2. 如果你可以使用IIS7,你最好利用IIS7的可扩展性(示例)。

-2

那么您需要重新实现限流模块 :)

思路是计算视频流的比特率,然后发送所需量到客户端。因此,您需要(非常简要地)从流中读取一个块并将其发送到客户端,然后休眠一秒钟。

对于处理IIS资源,Thread.Sleep(1000)并不是一个很好的选择,因此您需要以异步方式处理。IAsyncResult 将成为您的朋友。

有很多优化的空间。

最后一件事……我将其作为平面httphandler而非MVC ActionResult实现。如果您的网站允许,我建议您将其作为handler实现。


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