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.

Образ:

Inisrir a descrição da imagem aqui

Остальные браузеры в порядке. 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);
}
Другие вопросы по тегам