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

Asp.net mvc 如何使用ASP.NET MVC FileStreamResult流式传输部分内容,asp.net-mvc,http,streaming,partial,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"); } 不幸的是,Silverli

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

public ActionResult Preview(Guid id) {
    return new FileStreamResult(
        Services.AssetStore.GetStream(id, ContentType.Preview),
        "application/octet-stream");
}
不幸的是,Silverlight视频播放器在开始播放之前会下载整个视频文件。此行为是预期的,因为我们的
预览
操作不支持下载部分内容

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

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

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

另见:

  • 你必须自己实现这一点。是的,这将在IIS6上起作用
  • 如果您可以使用IIS7,那么您可能会更好地利用IIS7的可扩展性()

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

    其思想是计算视频流的比特率,然后根据需要向客户端发送尽可能多的数据。所以,您需要(非常简短地)从流中读取一个块,并将其发送到客户端,然后再休眠一秒钟

    Sleep(1000)对于处理IIS资源来说并不是一个好主意,所以您需要以异步的方式进行操作。我会是你的朋友

    有很大的空间进行各种优化

    最后一件事。。。我让它作为普通的httphandler工作,而不是MVC ActionResult。
    如果在您的webiste中可能的话,我建议您作为一个处理程序来执行此操作。

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

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