Я разрабатываю веб-приложение для 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);
Теперь то, что меня смущает, - это протоколы для запроса того, что сафари, кажется, используют. Из проксирования запросов через скрипач я получаю следующее для aprox 2MB файла.
ПРИМЕЧАНИЕ. При запросе файла mp4, непосредственно обслуживаемого через IIS 7, протокол и количество запросов одинаковы
- Сначала он запрашивает 2 байта, что позволяет читать заголовок Content-Range.
- Теперь он запрашивает весь контент (?)
- -
- Далее делается шаг 1 и 2. снова (??)
- -
- Теперь он запрашивает только части файла (???)
Если файл больше, последние шаги будут намного больше. Я проверил до 99 запросов, где каждый запрос содержит часть файла, разделенную поровну. Это имеет смысл и это то, что можно было бы ожидать, я думаю. Я не могу понять, почему он делает 2 начальных запроса для первых 2 байтов, а также 2 запроса для всего файла, прежде чем он наконец запросит файл в разных частях.
Как я завершаю этот результат в файле, загружаемом между 2 и 3 раза, в зависимости от длины файла и того, насколько пользователь наблюдает за ним достаточно долго.
Может ли кто-нибудь понять это поведение и, возможно, объяснить, что я могу сделать, чтобы предотвратить множественные загрузки. Спасибо.