У меня есть приложение, которое предназначено для потокового видео из нашей локальной БД. Я потратил много времени вчера, пытаясь вернуть данные a либо RangeFileContentResult
, либо RangeFileStreamResult
без успеха.
Короче говоря, когда я возвращаю файл как один из этих двух результатов, я не могу заставить видео правильно воспроизводить (или вообще играть).
Запрос из браузера отправляется со следующими заголовками:
Range: bytes=0-
И ответ приходит, дает эти заголовки в качестве примера:
Accept-Ranges: bytes
Content-Range: bytes 0-5103295/5103296
Что касается сетевого трафика, я получаю серию из 206 для частичных результатов, а затем 200 в конце (по мнению скрипача), которая кажется правильной. Вкладка Chrome network не согласуется с этим и видит первоначальный запрос (всегда 13 байт, которые, как я полагаю, является рукопожатием), затем еще несколько запросов, которые имеют статус либо отменены, либо ожидаются. Насколько я понимаю, это более или менее корректно, 206 - отменить, 206 - отменить и т.д. Но видео никогда не играет.
Если я переключу результат с моего контроллера на FileResult, видео воспроизводится и Chrome, IE10 и Firefox и, похоже, начнет играть до завершения загрузки (что немного похоже на потоковое воспроизведение, хотя я подозреваю, что это нет)
Но с результатом диапазона я ничего не получаю в хром или IE, а все видео загружается за один раз в firefox.
Насколько я понял, RangeFileContentResult
должен обрабатывать реакцию клиента на количество байтов для загрузки (которое, похоже, не работает, оно просто сообщает ему, чтобы получить весь файл (иллюстрируется ответом выше)). И клиент должен реагировать на это, что, похоже, не делает.
Есть ли у кого-нибудь мысли в этой области? В частности:
a) Должна ли RangeFileContentResult
отправлять диапазон байтов обратно клиенту?
б) Есть ли способ явным образом контролировать диапазон байтов, запрошенных с клиентской стороны?
c) Есть ли какая-либо причина или что-то, что я делаю неправильно здесь, что приведет к тому, что браузеры не будут загружать видео вообще при запросе RangeFileContentResult
?
EDIT: добавлена диаграмма, которая поможет описать, что я вижу:
EDIT2: Хорошо, поэтому сюжет сгущается. Во время игры с губбинами RangedFile нам нужно было выпустить еще одну версию тестовой версии системы, и я оставил "RangeFileContentResult" в моем действии контроллера, как показано ниже:
private ActionResult RetrieveVideo(MediaItem media)
{
return new RangeFileContentResult(media.Content, media.MimeType, media.Id.ToString(), DateTime.Now);
}
Скорее странно, теперь это похоже на работу в нашей тестовой среде Azure, но не на моей локальной машине. Интересно, существует ли что-то на базе IIS, которое работает на Azures IIS8, но не на моем локальном экземпляре 7.5?