8

我正在尝试让 HTML 5 离线应用程序缓存与 ASP MVC 3 网站一起使用。我遇到的问题是,当我尝试在脱机模式下导航到页面时,它不起作用。

我正在对清单文件使用一个操作,以便可以动态生成它,并在视图中指定 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 ,它会提供我希望看到的清单。

该网站不使用普通导航,而是使用哈希片段进行导航 - 因此导航到主页的 url 将是 master.htm#home 或者对于选项它将是 master.html#options。此哈希更改由 javascript 获取,并使用 ajax 将页面加载到主服务器中的 div 容器中,更具体地说,它使用 jQuery 中的“加载”方法来执行此操作。

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

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

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

4

1 回答 1

1

(我知道这个问题很老,但供将来参考......)

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

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

AddType text/cache-manifest .manifest

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

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

最后,如果您使用 AJAX 拉入的文件在 URL 中有参数,例如 ?id=1234,但未在清单文件中列出,则它将不起作用。这似乎不是这里的情况,但这是需要注意的。

于 2012-10-06T15:33:58.607 回答