【问题标题】:Does HTML 5 offline functionality work for browsers?HTML 5 离线功能是否适用于浏览器?
【发布时间】: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


【解决方案1】:

看起来您的初始请求是针对http://localhost/Sandbox/Car,那是您获得 404 的 URL 吗?清单通过 URL 工作,但它对默认页面或任何其他服务器配置一无所知。因此,就应用程序缓存而言,http://localhost/Sandbox/Carhttp://localhost/Sandbox/Car/Index 是不同的页面。除了您在其中包含对清单文件的引用之外,所涉及的视图在很大程度上与缓存无关。

【讨论】:

  • 是的,localhost/Sandbox/Car 是我得到 404 的 URL。又做了一些研发,发现如果我通过地址栏请求URL,我会得到一个404。如果我通过点击一个链接来请求URL 由@Html.ActionLink 渲染,离线资源会得到服务。什么给了?
  • @J.M. @Html.ActionLink 渲染的 URL 是什么?
  • /Sandbox/Car 是渲染的 URL。我又搞砸了一些,当我通过地址栏请求 URL 时,它神奇地工作了。我不知道我做了什么,我确定除了添加@Html.ActionLink 之外没有任何代码更改。无论如何,我最终让它工作了。
  • @J.M.您确定这些网址吗?我在回答中的重点是 /Sandbox/Car/Sandbox/Car/ 之类的 URL 是不同的。
  • 我刚看了看,确实是网址。您能否澄清您的意思 /Sandbox/Car 和 /Sandbox/Car 是不同的 URL?你是从清单的角度考虑的吗?我相信 MVC 默认会将这些 URL 路由到 index 操作方法。在这两种情况下,操作链接呈现的 URL 都是 /Sandbox/Car/Edit。
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2014-06-30
  • 2011-09-16
  • 1970-01-01
相关资源
最近更新 更多