Range Range в ASP.NET MVC - не удалось воспроизвести с помощью браузера Google и Opera
Я использую эту библиотеку здесь, и я использую этот плагин здесь для воспроизведения видео.
Следуйте коду:
контроллер:
[HttpGet]
public ActionResult StreamUploadedVideo()
{
byte[] test = null;
using (var ctx = new Entities())
{
var result = ctx.Table.Where(x => x.Field == 4).FirstOrDefault();
test = result.Movie;
return new RangeFileContentResult(test, "video/mp4", "Name.mp4", DateTime.Now);
}
}
Посмотреть:
<video id="my-video" class="video-js" controls preload="auto" width="640" height="264" poster="MY_VIDEO_POSTER.jpg" data-setup="{}">
<source src="@Url.Action("StreamUploadedVideo","Controller")" type='video/mp4'>
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
</p>
</video>
Проблема: Когда я меняю время видео (пример: меняем время с 1:00 на 10:00 минут), я сталкиваюсь с этой проблемой ниже:
Гугл Хром: A network error caused the media download to fail part-way.
Opera: The media playback was aborted due to corruption problem or because the used features your browser did not support.
Образ:
Остальные браузеры в порядке. Google и Opera с последней обновленной версией сегодняшней даты: 07/04/2017
Micrososft Edge - хорошо
Firefox - хорошо
Internet Explorer - хорошо
Опера - Ошибка
Google - Ошибка
Любое решение?
1 ответ
Существует проблема с вашим кодом, когда вы используете DateTime.Now
за modificationDate
который используется для генерации ETag
а также Last-Modified
заголовки. Поскольку хром (двигатель позади Chrome и Opera), запросы диапазона могут быть условными (что означает, что они могут содержать If-Match
/If-None-Match
/If-Modified-Since
/If-Unmodified-Since
) это приводит к 412 Precondition Failed
вместо 200 OK
или же 206 Partial Content
, Если основной контент не меняется, вы должны использовать ту же дату, что-то вроде этого.
[HttpGet]
public ActionResult StreamUploadedVideo()
{
byte[] test = null;
DateTime lastModificationDate = DateTime.MinValue;
using (var ctx = new Entities())
{
var result = ctx.Table.Where(x => x.Field == 4).FirstOrDefault();
test = result.Movie;
lastModificationDate = result.LastModificationDate;
}
return new RangeFileContentResult(test, "video/mp4", "Name.mp4", lastModificationDate);
}