Как потоковое частичное содержимое с ASP.NET MVC FileStreamResult - PullRequest
10 голосов
/ 21 июля 2009

Мы используем FileStreamResult для предоставления видеоданных в видеоплеер на основе Silverlight MediaElement:

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

К сожалению, видеопроигрыватель Silverlight загружает весь видеофайл до начала воспроизведения. Такое поведение ожидается, поскольку наше Preview действие не поддерживает загрузку частичного содержимого.

(примечание: если файл размещен в виртуальном каталоге IIS, мы можем начать воспроизведение в любом месте видео, пока оно еще загружается. Однако по соображениям безопасности и аудита мы не можем предоставить прямую ссылку для скачивания. это не вариант.)

Как мы можем улучшить действие контроллера для поддержки частичного содержимого HTTP?

Я предполагаю, что сначала мы должны сообщить клиенту, что мы его поддерживаем (добавив заголовок «Accept-Ranges: bytes» в запрос HEAD), затем мы должны оценить заголовок HTTP «Range» и потоковую передачу запрошенного диапазона файлов с кодом ответа 206. Будет ли это работать с ASP.NET MVC, размещенным на IIS6? Уже есть код?

Также см .:

Ответы [ 3 ]

5 голосов
/ 17 ноября 2010

Существует проект на CodePlex, который предоставляет именно эту функциональность.

http://mediastreamingmvc.codeplex.com/

Посмотри. Он был создан специально для этого сценария, в котором вы хотите выполнить действие, представляющее запрос к виртуальному ресурсу, и возвращать частичное содержимое по запросу, не требуя от разработчика многого для его поддержки (фильтр действий и выбор типов результатов.) 1006 *

0 голосов
/ 21 июля 2009

Тогда вам нужно переопределить модуль дросселирования:)

Идея состоит в том, чтобы рассчитать битрейт вашего видеопотока и затем отправить столько, сколько требуется клиенту. Поэтому вам нужно (очень кратко) прочитать блок из вашего потока и отправить его клиенту и поспать секунду.

Thread.Sleep (1000) не очень хорошая идея для обработки ресурсов IIS, поэтому вам нужно делать что-то асинхронным образом. IAsyncResult будет вашим другом.

Существует много возможностей для всех видов оптимизаций.

И последнее ... я сделал так, чтобы он работал как простой httphandler, а не как MVC ActionResult. Если это возможно на вашем веб-сайте, я рекомендую сделать это как обработчик.

0 голосов
/ 21 июля 2009
  1. Вы должны реализовать это самостоятельно. И да, это будет работать на IIS6.
  2. Если вы можете использовать IIS7, вам, вероятно, лучше использовать расширяемость IIS7 ( пример ).
...