HTML 5缓存清单是否也适用于ajax请求?

时间:2012-01-03 14:32:13

标签: html5 offline-caching offline-mode

我正在尝试使用ASP MVC 3网站获取HTML 5离线应用程序缓存。我得到的问题是 当我尝试在离线模式下导航到某个页面时,它不起作用。

我正在使用清单文件的操作,以便可以动态生成它,并在我指定的视图中 Resonse.ContentType =“text / cache-manifest”。

我已在IIS中本地托管了应用程序,因此我使用http://192.168.55.127/mywebsite/来访问它。

这是我正在使用的清晰视图。它使用剃刀视图引擎,有点乱(硬编码的URL等) 我想弄清楚什么是错的。

@{
     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:
*

这导致如下路径:

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

似乎很好。

我也使用完整路径引用了清单文件:

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

这似乎没问题,因为当我在chrome中加载网站并观察开发者控制台时,它就会显示出来 缓存所有文件而不会抛出任何错误。如果我导航到http://192.168.55.127/mywebsite/manifest 正如我期望的那样,它可以提供清单。

网站不使用普通导航,而是使用散列片段导航 - 因此要导航到home,url将是master.htm #home或者选项是master.html#options。这个哈希更改由javascript获取,它使用ajax将页面加载到master中的div容器中,更具体地说,它使用jQuery中的'load'方法来执行此操作。

这一切都可以在脱机模式下正常工作,并且在导航时在chrome中观察网络选项卡时,请求URL是正确的,并且是清单文件中列出的相同URL。我唯一能想到的是离线模式不适用于ajax请求,但我的印象是它的工作原理相同。

我正在使用FireFox(版本9.0)测试离线模式,方法是清除所有历史记录,浏览到网站主页,启用离线模式,然后尝试导航到选项页面。在firebug中,我看到GET请求选项页面的正确URL,但它永远不会返回,甚至不会出错。装载轮(在firebug中的网络标签中的请求旁边)只是继续转动,好像它仍在装载。我也在Opera 11.60中尝试过它(因为它也有离线模式),同样的事情发生了。

任何人都对我做错了什么有任何想法?我是否错过了一些明显或误解清单应如何工作的东西?任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

(我知道这个问题已经过时但未来参考了......)

如果AJAX内容文件在AppCache清单文件中正确列出(它们似乎是),那么这应该可行。就个人而言,我会使用相对而不是绝对的路径,但这不应该有所作为。

您的问题似乎是清单文件没有文件扩展名。尝试将文件(及其在master.htm中的引用)重命名为appcache.manifest或类似名称。然后,您需要确保在服务器中设置了清单文件的MIME类型。例如。对于Apache,你可以添加类似的东西:

AddType text/cache-manifest .manifest

到服务器的配置文件或.htaccess文件。

此外,除了在测试时清除缓存数据时,请确保在更改清单文件时至少刷新页面几次,因为浏览器会检查更新并在单独的页面加载中下载文件。 / p>

最后,如果您使用AJAX提取的文件在网址中包含参数,则无法使用,例如?id = 1234,但未在清单文件中列出。这似乎不是这种情况,但需要注意的事项。