【问题标题】:How to stream partial content with ASP.NET MVC FileStreamResult如何使用 ASP.NET MVC FileStreamResult 流式传输部分内容
【发布时间】:2010-11-12 13:58:40
【问题描述】:

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

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

很遗憾,Silverlight 视频播放器会在开始播放之前下载整个视频文件。由于我们的Preview Action 不支持下载部分内容,因此这是正常现象。

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

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

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

另见:

【问题讨论】:

    标签: asp.net-mvc http streaming partial


    【解决方案1】:
    1. 您必须自己实现。是的,这将适用于 IIS6。
    2. 如果您可以使用 IIS7,则最好利用 IIS7 的可扩展性 (example)。

    【讨论】:

      【解决方案2】:

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

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

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

      各种优化的空间很大。

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

      【讨论】:

        【解决方案3】:

        CodePlex 上有一个项目提供了这个确切的功能。

        http://mediastreamingmvc.codeplex.com/

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

        【讨论】:

          猜你喜欢
          • 2014-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多