【发布时间】:2012-04-19 21:19:55
【问题描述】:
我已经为此工作了几天,并且变得越来越沮丧。我在 Chrome、FF 上得到不一致的离线功能结果,我刚刚开始使用 Safari。
我正在使用 Asp .Net MVC 3 开发一个沙盒应用程序。下面是我的应用程序的结构:
- 控制器/汽车控制器
- 查看/汽车/编辑
- Views/Car/EditOffline
- 查看次数/汽车/索引
在 3 个视图中,Index 是唯一定义了 manifest 属性的视图。索引是最初请求的视图。以下是我的清单内容:
CACHE MANIFEST
FALLBACK:
Car/Edit Car/EditOffline
#Version 1
在第一次请求 Index 时,浏览器在应用程序缓存中创建 3 个条目。它们是:
- localhost/Sandbox/Car, type = master
- localhost/Sandbox/Car/EditOffline, type = fallback
- localhost/Sandbox/Offline.,类型 = 清单
我为所有 3 个浏览器模拟离线行为的方式是显式停止 IIS。之后,已请求索引。我关闭了 IIS 并向 Edit 操作发出请求。结果是 EditOffline 得到了服务。现在,当我再次查看 Index 视图时,我收到 404 错误,但为什么呢?我以为浏览器会提供该页面的缓存版本?当我重新请求编辑视图时(仍处于离线状态),我也收到 404 错误,但为什么呢?浏览器之前提供了 EditOffline 视图,那么为什么我现在得到 404 呢?在 FF 中,我已经让它按预期工作了几次,但我没有进行任何代码更改。我明确删除了离线缓存,重新启动服务器,重新请求索引视图,它神奇地工作了。
【问题讨论】:
-
您的浏览器可能仍认为您在线。在 FF 中尝试通过单击文件 -> 脱机工作来强制脱机。还可以使用缓存 api 来检查您的数据是否真的被下载并可以离线使用。不要忘记在清单中包含 .css 和 .js 文件。
-
@ZippyV 浏览器是否认为它在线与应用程序缓存无关,重要的是whether or not it can contact the server
-
在做了一些额外的研发之后,这是我发现的。当我停止 IIS 并请求 Car/Edit 时,会从 appCache 中检索 Car/EditOffline 并显示给用户。提供页面后,appCache 检查事件会触发,然后触发过时事件。我相信,由于浏览器无法检索清单文件的状态,它会触发过时事件,这反过来又将现有的清单文件标记为不再需要并且应该被删除。因此,对存储在 appCache 中的资源的后续请求会返回 404 结果。
-
根据 w3c 规范:“如果由于 404 或 410 响应或等效响应而导致获取清单失败,则运行以下子步骤:将缓存组标记为过时。此缓存组不再存在于任何除了处理已与缓存组中的应用程序缓存相关联的 Document 对象之外的其他目的。”所以我期待任何对 manifest/appCache 中存在的资源的请求都会被浏览器填充;但是,根据我的观察,情况并非如此。也许我对规范的解释有误?
-
@J.M.我不这么认为。如果 IIS 未运行,则无法返回 404 或 410。
标签: asp.net-mvc-3 html offline-caching