移动 Safari 发出多个视频请求

Posted

技术标签:

【中文标题】移动 Safari 发出多个视频请求【英文标题】:Mobile Safari makes multiple video requests 【发布时间】:2011-08-30 23:24:03 【问题描述】:

我正在为 iPad 设计一个 Web 应用程序,它在移动 safari 中使用 html5。我通过运行 .NET Framework v2.0 的 IIS 7 上托管的 ASP.NET .ashx 文件手动传输文件。

基本代码部分如下所示:

// 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);

现在让我困惑不已的是请求 safari 似乎使用的协议。通过 fiddler 代理请求,我得到了大约 2MB 文件的以下内容。

注意:当请求 mp4 文件时,直接通过 IIS 7 提供服务,协议和请求量是相同的

    首先它请求 2 个字节,以便读取“Content-Range”标头。 现在它请求整个内容 (?) - 它继续执行第 1 步和第 2 步 (??) - 它现在只请求文件的一部分 (???)

如果文件更大,最后的步骤会更多。我测试了多达 99 个请求,其中每个请求都包含文件的一部分,均等分。这是有道理的,也是我认为的预期。我无法理解的是为什么它在最终请求不同部分的文件之前对前 2 个字节发出 2 个初始请求以及对整个文件发出 2 个请求。

根据我的结论,这会导致文件被下载 2 到 3 次,具体取决于文件的长度以及用户观看的时间是否足够长。

任何人都可以理解这种行为并解释我可以做些什么来防止多次下载。谢谢。

【问题讨论】:

我遇到了同样的事情。它也是 ipod,如果您正在处理 mp3 文件。不幸的是没有解决方案...... 我注意到一个非常大 (30meg) 的视频也是如此。当请求来自 iPad 时,有时 3 次请求整个文件! 这称为渐进式下载。您确实应该支持 206 个视频文件的部分下载请求。我个人对 ASP 一无所知,所以我无法给出一个我知道有效的实际示例,但谷歌“在 ASP 中实现 http 206 下载支持”或询问与此相关的更具体的问题,以获取有关如何操作的更多详细信息继续。 我对 MPMoviePlayerController 中的 mp3 文件也有同样的体验。这是我问过的一个问题,但没有得到回答。我的问题有更多关于正在提出的请求的信息。 ***.com/questions/4855485/… 【参考方案1】:

根据我对您问题的评论,我过去也遇到过类似的问题。如果您可以控制服务器(我没有),您可以尝试的一件事是禁用 gzip 或文件的身份编码。我相信在对整个内容的第一个请求(列表中的#2)中,它要求使用 gzip 编码(压缩)的内容。也许您可以将 IIS 配置为不为 gzip 编码请求提供文件。

这是我关于该主题的原始(未回答)问题:

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

【讨论】:

以上是关于移动 Safari 发出多个视频请求的主要内容,如果未能解决你的问题,请参考以下文章

错误-TypeError:仅在向 Angular 5 应用程序内的 api 服务器发出 GET 请求后,在 Safari 上输入错误

FireFox 不发送 CORS 请求(使用 jQuery)

错误 - TypeError:在对angular 5 app内的api服务器发出GET请求后,仅在Safari上键入错误

Vue 2.6 在 Safari IOS 上无法正常工作

移动端页面 iPhone + Safari 页面调试 之 正确查看网络请求的姿势

发出多个 Axios 请求导致 CORS 错误