2012-01-03 10 views
8

Estoy tratando de obtener caché de aplicaciones sin conexión HTML 5 trabajando con un sitio web ASP MVC 3. El problema que tengo es que cuando trato de navegar a una página en modo fuera de línea, no funciona.¿Debería funcionar el manifiesto de caché HTML 5 con las solicitudes ajax también?

Estoy usando una acción para el archivo de manifiesto para que se pueda generar dinámicamente, y en la vista especifico Resonse.ContentType = "text/cache-manifest".

He alojado la aplicación localmente en IIS, así que estoy usando http://192.168.55.127/mywebsite/ para acceder a ella.

Esta es la vista de manifiesto que estoy usando. Utiliza el motor de vista de afeitar y es un poco desordenado (URL codificada, etc.) mientras trato de averiguar qué sucede.

@{ 
    Layout = null; 
    Response.ContentType = "text/cache-manifest"; 
} 
CACHE MANIFEST 

# Version: @ViewBag.Version 

CACHE: 
#Script Files 
@foreach(var jsFile in Url.GetJsFiles()) 
{ 
    @string.Format("{0}{1}\r\n", "http://192.168.55.127", Url.Content(jsFile)) 
} 

#Style Sheets 
@foreach(var cssFile in Url.GetCssFiles()) 
{ 
    @string.Format("{0}{1}\r\n", "http://192.168.55.127", Url.Content(cssFile)) 
} 

#Images 
@foreach(var imageFile in Url.GetImageFiles()) 
{ 
    @string.Format("{0}{1}\r\n", "http://192.168.55.127", Url.Content(imageFile)) 
} 

#HTML Pages 
@string.Format("{0}{1}", "http://192.168.55.127", Url.Content("~/pages/master.htm")) 
@string.Format("{0}{1}", "http://192.168.55.127", Url.Content("~/pages/home.htm")) 
@string.Format("{0}{1}", "http://192.168.55.127", Url.Content("~/pages/options.htm")) 

NETWORK: 
* 

Esto resulta en caminos como:

http://192.168.55.127/mywebsite/scripts/Libs/jQuery.js 
http://192.168.55.127/mywebsite/pages/home.htm 

que parece estar bien.

he referenciado el archivo de manifiesto mediante la ruta completa también:

<html manifest="http://192.168.55.127/mywebsite/manifest"> 

que parece estar bien, como cuando me carga el sitio en cromo y observo la consola de desarrolladores, parece para almacenar en caché todos los archivos sin arrojar ningún error. Además, si navego al http://192.168.55.127/mywebsite/manifest , se muestra el manifiesto como esperaba verlo.

El sitio web no utiliza la navegación normal, en su lugar navega utilizando fragmentos de hash, por lo que para navegar a casa, la URL sería master.htm # home o para las opciones sería master.html # options. Este cambio hash es recogido por javascript y carga la página en un contenedor div en el maestro usando ajax, más específicamente usa el método 'load' en jQuery para hacer esto.

Todo esto funciona bien cuando no está en modo fuera de línea, y al observar la pestaña de red en cromo al navegar, la URL de solicitud es correcta y es la misma URL que figura en el archivo de manifiesto. Lo único que se me ocurre es que el modo fuera de línea no funciona para la solicitud de ajax, pero tenía la impresión de que funcionaba igual.

Estoy probando el modo fuera de línea usando FireFox (versión 9.0) borrando todo el historial, navegando a la página de inicio del sitio web, habilitando el modo fuera de línea y luego tratando de navegar a la página de opciones. En firebug veo una solicitud GET para la URL correcta de la página de opciones, pero nunca regresa, ni siquiera se produce un error. La rueda de carga (al lado de la solicitud en la pestaña de la red en Firebug) simplemente sigue girando como si aún se estuviera cargando. Lo probé en Opera 11.60 también (ya que también tiene un modo fuera de línea) y ocurre el mismo tipo de cosas.

¿Alguien tiene alguna idea de lo que estoy haciendo mal? ¿Me he perdido algo obvio o entendido mal cómo debería funcionar el manifiesto? Cualquier sugerencia será apreciada.

Respuesta

1

(sé de edad, pero como referencia para el futuro la cuestión ...)

Si los archivos de contenido AJAX se enumeran en el archivo de manifiesto AppCache correctamente (que parecen ser), entonces esto debería funcionar. Personalmente, usaría rutas relativas en lugar de absolutas, pero eso no debería marcar la diferencia.

Su problema parece ser que el archivo de manifiesto no tiene una extensión de archivo.Intente cambiar el nombre del archivo (y su referencia en master.htm) al appcache.manifest o similar. Luego debe asegurarse de que el tipo MIME del archivo manifest esté configurado en el servidor. P.ej. para Apache deberá añadir algo como:

AddType text/cache-manifest .manifest 

al archivo de configuración del servidor o su archivo .htaccess.

Además, además de borrar los datos en caché durante las pruebas, asegúrese de actualizar la página al menos un par de veces cuando realice un cambio en el archivo de manifiesto porque el navegador busca actualizaciones y descarga archivos en cargas de página separadas.

Por último, no funcionará si los archivos que está instalando con AJAX tienen parámetros en la URL, p. ? id = 1234, pero no figuran como tales en el archivo de manifiesto. Ese no parece ser el caso aquí, pero es algo a tener en cuenta.

Cuestiones relacionadas