如何使用ASP.NET MVC FileStreamResult流式传输部分内容

时间:2009-07-21 08:50:01

标签: asp.net-mvc http streaming partial

我们正在使用FileStreamResult为基于Silverlight MediaElement的视频播放器提供视频数据:

public ActionResult Preview(Guid id) {
    return new FileStreamResult(
        Services.AssetStore.GetStream(id, ContentType.Preview),
        "application/octet-stream");
}

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

(旁注:如果文件托管在IIS虚拟目录中,我们可以在视频中的任何位置继续播放,但是出于安全和审核原因,我们无法提供直接下载链接。这不是一种选择。)

我们如何改进Controller Action以支持部分HTTP内容?

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

另见:

3 个答案:

答案 0 :(得分:5)

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

http://mediastreamingmvc.codeplex.com/

看一看。它是专门为此场景创建的,您希望有一个动作来表示对虚拟资源的请求,并在需要时返回部分内容,而不需要开发人员做很多事情来支持它(动作过滤器和结果类型的选择。)< / p>

答案 1 :(得分:0)

  1. 你必须自己实现这个。是的,这将适用于IIS6。
  2. 如果您可以使用IIS7,最好利用IIS7的可扩展性(example)。

答案 2 :(得分:-1)

然后你需要重新实现限制模块:)

我们的想法是计算视频流的比特率,然后根据需要向客户端发送。因此,您需要(非常简短地)从流中读取一个块并将其发送到客户端并休眠一秒钟。

Thread.Sleep(1000)对于处理IIS资源并不是一个好主意,因此您需要以异步方式执行操作。 IAsyncResult将是你的朋友。

各种优化都有很大的空间。

最后一件事......我让它以普通的httphandler工作,而不是MVC ActionResult。 如果你的网站有可能,我建议你做一个处理程序。