2011-05-23 27 views
16

Estoy diseñando una aplicación web para iPad que hace uso de HTML5 en safari móvil. Estoy transmitiendo el archivo manualmente a través de un archivo ASP.NET .ashx alojado en IIS 7 ejecutando .NET Framework v2.0.Mobile Safari realiza solicitudes de video múltiples

El código esencial se ve en parte como esto:

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

Ahora lo que me confunde es que no tiene fin los protocolos para los que solicita que Safari parece usar. De proxying las solicitudes a través de fiddler me sale lo siguiente para un archivo aproximado de 2MB.

Fiddler requests

NOTA: Al solicitar un archivo MP4, servido directamente a través de IIS 7, el protocolo y la cantidad de pedido son los mismos

  1. En primer lugar se solicita 2 bytes que le permite leer el encabezado 'Content-Range'.
  2. Ahora pida a todo el contenido de
  3. (?) -
  4. Se procede a hacer el paso 1. 2. & de nuevo (??)
  5. -
  6. Se solicita ahora sólo las partes del archivo (???)

Si el archivo es más grande, los últimos pasos serán muchos más. He probado hasta 99 solicitudes donde cada solicitud contiene una parte del archivo igualmente dividida. Esto tiene sentido y es lo que se esperaría, creo. Lo que no puedo entender es por qué hace 2 solicitudes iniciales para los primeros 2 bytes, así como 2 solicitudes para todo el archivo antes de que finalmente solicite el archivo en diferentes partes.

Como llego a la conclusión, esto hace que el archivo se descargue entre 2 y 3 veces, dependiendo de la longitud del archivo y si el usuario lo mira el tiempo suficiente.

¿Alguien puede dar sentido a este comportamiento y quizás explicar lo que puedo hacer para evitar descargas múltiples. Gracias.

+0

me encontré con lo mismo. también es iPod y si se trata de archivos mp3. Desafortunadamente, ninguna solución ... – worenga

+0

He notado lo mismo con un video muy grande (30 megas). A veces, 3 solicitudes para el archivo completo cuando la solicitud proviene de un iPad. –

+0

He tenido la misma experiencia con archivos mp3 dentro del MPMoviePlayerController. Aquí hay una pregunta que hice acerca de esto que no recibió respuesta. Mi pregunta tiene un poco más de información sobre las solicitudes que se realizan. http://stackoverflow.com/questions/4855485/mpmovieplayercontroller-not-playing-full-length-mp3 – TomSwift

Respuesta

1

Por mi comentario a su pregunta, he tenido un problema similar en el pasado. Una cosa que podrías probar si tienes el control del servidor (no lo hice) es deshabilitar gzip o la codificación de identidad del archivo. Creo que en la primera solicitud de todo el contenido (n. ° 2 de la lista) se solicita el contenido con la codificación gzip (comprimida). Quizás pueda configurar su IIS para que no sirva el archivo para una solicitud de codificación gzip.

Aquí es mi original (sin respuesta) pregunta sobre el tema:

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

Cuestiones relacionadas