9

我正在尝试为一个非常大(大约 2 GB)的 Web 应用程序创建一个 HTML5 应用程序缓存,该应用程序将在 Windows 8 Professional 平板电脑和 IE10 内部使用。某些原因导致缓存过程失败,但我能找到的唯一调试信息是 F12 控制台,它简单地指出“AppCache 致命错误”。

我做了一个错误处理程序并尝试调试:

if (window.applicationCache)
{
    var oAppCache = window.applicationCache;
    oAppCache.onerror = function(e) {
      alert(e); // Outputs [object Event], I use this row as a breakpoint target
    };
}

但是,e使用调试器查看时,不包含任何有用信息。

根据网络服务器日志,错误之前请求的最后一个文件是 JPEG,就像许多其他文件一样。我应该从哪里开始寻找导致错误的线索?该页面在 Firefox 上缓存良好。

4

5 回答 5

9

一段时间以来,我一直在同一个问题上摇头。我对清单进行了二进制处理,直到找出导致错误的行:它是CACHE 条目的第 1000 行(不仅仅是清单的第 1000 行)。

在 IE10 的缓存中,您可以拥有的项目数量似乎存在硬性限制。经过几分钟的搜索,我还没有在任何地方找到这个记录,但我敢说,更坚持不懈的人可能会对其进行搜索。

我验证了第 1000 个 CACHE 项的内容是什么无关紧要;IE 只是阻止您直接开始缓存下载。这可能是出于安全原因的限制,阻止某人淹没缓存,或者通过将包含数千个条目的清单注入页面来使用它来 DoS 站点。

也许尝试将您的应用程序分成具有不同缓存的块(通过子域?)。如果分块下载可能会带来更好的用户体验,您始终可以通过在一系列较小的缓存之间重定向来自动化“安装”。

于 2013-06-06T12:09:56.830 回答
7

作为记录:我在 IE (10) 给我时遇到了麻烦AppCache Fatal Error。事实证明,IE 需要使用正确的内容类型来提供清单,即

Content-Type: text/cache-manifest

Chrome 和 Firefox 没有那么挑剔。

于 2013-09-26T22:04:32.047 回答
3

如果它对任何人有帮助,我找到了另一种纠正这个错误的方法。

如果您正在使用应用程序缓存并将带有 cache.manifest 条目的 html 文件的 Cache-Control 标头设置为“Cache-Control: no-cache, no-store”,您将收到此错误。删除 Cache-Control 标头的 no-store 标志将解决此实例中的问题。我试图将应用程序缓存仅用于资源,而不是用于 html 页面本身,但不幸的是,这不是它的设计目的。

另请注意,所有其他浏览器只会忽略 cache.manifest 中文件的 no-store 标志,而 IE 在技术上做正确的事,因为它更加迂腐。

于 2013-09-20T00:40:47.173 回答
1

Internet Explorer 组策略将缓存资源列表大小的限制设置为 1000 项。这可以通过更改此策略来扩展。更多可以在这里找到,部分“设置最大应用程序缓存资源列表大小”。

于 2014-03-12T13:18:25.627 回答
0

我的问题是,IIS 使用了.manifest-Extension 并将其设置Content-Typex-ms-manifest. 因此,我在 web.config 中添加了以下内容 - 这解决了fatal error(IE 11)问题,并且appcache 现在可以与 HTTPS(SSL)一起使用,而它以前没有(仅与 HTTP 一起使用):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="."
            inheritInChildApplications="false">
    <system.webServer>
...
      <staticContent>
        <remove fileExtension=".manifest"/>
        <mimeMap fileExtension=".manifest" mimeType="text/cache-manifest"/>
      </staticContent>
...
    </system.webServer>
  </location>
</configuration>
于 2016-08-25T11:10:20.920 回答