Mobile Safari会发出多个视频请求

Jac*_*sen 16 iis-7 range mobile-safari ipad html5-video

我正在为iPad设计一个Web应用程序,它在移动游猎中使用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);
Run Code Online (Sandbox Code Playgroud)

现在让我感到困惑的是请求Safari似乎使用的协议.通过fiddler代理请求,我得到以下aprox 2MB文件.

提琴手要求

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

  1. 首先它请求2个字节,允许它读取'Content-Range'标题.
  2. 现在它请求整个内容(?)
  3. -
  4. 它继续执行步骤1.&2.再次(??)
  5. -
  6. 它现在只请求部分文件(???)

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

当我得出结论时,这导致文件被下载2-3次,具体取决于文件的长度以及用户是否足够长时间观看.

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

Tom*_*ift 1

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

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

/sf/ask/339883981/