Mobile Safari会发出多个视频请求

时间:2011-05-23 08:18:29

标签: ipad iis-7 mobile-safari range 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);

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

Fiddler requests

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

  1. 首先它请求2个字节,允许它读取'Content-Range'标题。
  2. 现在请求整个内容(?)
  3. -
  4. 继续进行第1步。 2.再次(??)
  5. -
  6. 它现在只请求部分文件(???)
  7. 如果文件较大,最后的步骤将会更多。我已经测试了多达99个请求,其中每个请求包含文件的一部分平均分割。这是有道理的,也是我认为的预期。我无法理解的是,为什么它在最后请求不同部分的文件之前,对前两个字节以及整个文件的2个请求进行2次初始请求。

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

    任何人都可以理解这种行为,并解释我可以采取哪些措施来防止多次下载。感谢。

1 个答案:

答案 0 :(得分:1)

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

以下是关于此主题的原始(未答复)问题:

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