11

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

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

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

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

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

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

另见:

4

3 回答 3

5

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

http://mediastreamingmvc.codeplex.com/

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

于 2010-11-16T23:20:51.103 回答
0
  1. 您必须自己实现这一点。是的,这将适用于 IIS6。
  2. 如果您可以使用 IIS7,您可能会更好地利用 IIS7 的可扩展性(示例)。
于 2009-07-21T09:04:32.850 回答
-2

然后你需要重新实现节流模块:)

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

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

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

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

于 2009-07-21T11:03:52.873 回答