Mobile Safari делает несколько видео запросов - PullRequest
16 голосов
/ 23 мая 2011

Я разрабатываю веб-приложение для iPad, которое использует HTML5 в мобильном сафари.Я передаю файл вручную через файл ASP.NET .ashx, размещенный на IIS 7 под управлением .NET Framework v2.0.

Основной код выглядит частично так:

// If we receive range header only transmit partial file
if (context.Request.Headers["Range"] != null)
{
    var fi = new FileInfo(filePath);
    long fileSize = fi.Length;

    // Read start/end index
    string headerRange = context.Request.Headers["Range"].Replace("bytes=", "");
    string[] range = headerRange.Split('-');
    int startIndex = Convert.ToInt32(range[0]);
    int endIndex = Convert.ToInt32(range[1]);

    // Add header Content-Range,Last-Modified
    context.Response.StatusCode = (int)HttpStatusCode.PartialContent;
    context.Response.AddHeader(HttpWorkerRequest.GetKnownResponseHeaderName(HttpWorkerRequest.HeaderContentRange), String.Format("bytes {0}-{1}/{2}", startIndex, endIndex, fileSize));
    context.Response.AddHeader(HttpWorkerRequest.GetKnownResponseHeaderName(HttpWorkerRequest.HeaderLastModified), String.Format("{0:r}", fi.CreationTime));

    long length = (endIndex - startIndex) + 1;
    context.Response.TransmitFile(filePath, startIndex, length);
}
else
    context.Response.TransmitFile(filePath);

ТеперьЧто меня смущает, так это протоколы для запросов, которые, похоже, использует сафари.При передаче запросов через fiddler я получаю следующее для файла aprox 2MB.

Fiddler requests

ПРИМЕЧАНИЕ. При запросе файла mp4, напрямую обслуживаемого через IIS 7, протоколи количество запросов одинаковы

  1. Сначала он запрашивает 2 байта, что позволяет ему прочитать заголовок «Content-Range».
  2. Теперь он запрашивает весь контент (?)
  3. -
  4. Продолжается выполнение шага 1. & 2. снова (??)
  5. -
  6. Теперь запрашиваются только частиfile (???)

Если размер файла больше, последние шаги будут намного больше.Я протестировал до 99 запросов, где каждый запрос содержит часть файла, разделенную поровну.Это имеет смысл, и это то, что можно ожидать, я думаю.Я не могу понять, почему он делает 2 начальных запроса для первых 2 байтов, а также 2 запроса для всего файла, прежде чем он, наконец, запрашивает файл в разных частях.

Когда я пришел к выводу, это приводит кфайл загружается 2-3 раза, в зависимости от длины файла и того, просматривает ли пользователь его достаточно долго.

Может кто-нибудь разобраться в этом поведении и, возможно, объяснить, что я могу сделать, чтобы предотвратить многократную загрузку.Спасибо.

1 Ответ

1 голос
/ 15 декабря 2011

За мой комментарий к вашему вопросу у меня была похожая проблема в прошлом.Одна вещь, которую вы можете попробовать, если у вас есть контроль над сервером (я этого не сделал), это отключить gzip или идентификационную кодировку файла.Я полагаю, что в первом запросе всего контента (# 2 в вашем списке) он запрашивает контент с кодировкой gzip (сжатый).Возможно, вы можете настроить свой IIS так, чтобы он не обслуживал файл для запроса кодировки gzip.

Вот мой оригинальный (без ответа) вопрос по теме:

https://stackoverflow.com/questions/4855485/mpmovieplayercontroller-not-playing-full-length-mp3

...