如何流与ASP.NET MVC FileStreamResult部分内容(How to stream

2019-07-30 12:47发布

我们使用一个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请求),那么我们必须评估HTTP“范围”报头,并用响应流所需的文件范围206.代码将与ASP.NET MVC的工作托管在IIS6? 是否已有一些代码可用?

另请参阅:

  • http://en.wikipedia.org/wiki/List_of_HTTP_headers
  • http://blogs.msdn.com/anilkumargupta/archive/2009/04/29/downloadprogress-downloadprogressoffset-and-bufferprogress-of-the-mediaelement.aspx
  • http://benramsey.com/archives/206-partial-content-and-range-requests/

Answer 1:

有在CodePlex上赋予这个确切的功能的项目。

http://mediastreamingmvc.codeplex.com/

看一看。 它是为这种情况下,你希望有代表的虚拟资源的请求的动作,如果不要求开发者做很多工作来支持它提出要求返回部分内容专门创建(结果类型的操作过滤和选择。)



Answer 2:

  1. 你必须自己来实现这一点。 是的,这将在IIS6工作。
  2. 如果你可以用IIS7你可能更好地利用在IIS7的可扩展性( 例如 )。


Answer 3:

然后,你需要重新实现调速模块:)

我们的想法是计算你的视频流的比特率,然后根据需要对客户端发送尽可能多的。 因此,你需要(很简单),从您的流读取块并将其发送到客户端和睡眠一秒钟。

Thread.sleep代码(1000)是不是真的用于处理IIS资源,所以你需要做的东西在异步方式是一个好主意。 IAsyncResult的将是你的朋友。

空间还有多大各种最佳化的。

而最后一件事......我做了它的工作为纯HttpHandler的,而不是MVC的ActionResult。 如果它在你的网站是可能的,我建议做一个处理程序。



文章来源: How to stream partial content with ASP.NET MVC FileStreamResult