2

好的,我正在为需要具有离线功能的移动应用程序构建 PoC,并且我有几个关于我是否正确设计应用程序以及我将从缓存清单中获得什么行为的问题。

这个问题是关于在清单的 CACHE 部分和 NETWORK 部分中包含控制器操作的 URL。

我相信我已经在网上阅读了一些关于此的相互矛盾的信息。在一些站点中,我读到在 NETWORK 部分中包含通配符会使浏览器在服务器在线时尝试从服务器检索所有内容,如果没有互联网连接,则只使用缓存的任何内容。

然而,今天早上我在Dive into HTML5 上阅读了以下内容:让我们离线

标记为 NETWORK: 的行是“在线白名单”部分的开始。本节中的资源从不缓存,并且不能离线使用。(尝试在离线时加载它们会导致错误。)

那么,哪些信息是正确的呢?如果我在 CACHE 和 NETWORK 部分都添加了控制器操作的 URL,应用程序将如何运行?

到目前为止,我有一个非常简单且小型的 PoC,这就是我在这个问题上观察到的:

  1. 我有一个控制器动作,它只生成 4 个随机数并将它们设置在 ViewBag 上,然后视图将在 UL 上显示它们。

  2. 我根本没有使用输出缓存。唯一的缓存来自清单文件。

  3. 在将 manifest 属性添加到我的 Layout.cshtml 的 html 标记之前,每次我请求 View 时,我都会得到不同的随机数,并且会命中控制器操作上设置的断点。

  4. 我在添加清单属性后第一次请求 URL/View 时,控制器上的断点被命中 3 次(而不是之前只有 1 次)。这已经很奇怪了,我将发布一个单独的问题,我只是在这里写下它以供参考。

  5. 在清单和资源被缓存后(通过查看 Chrome 开发工具上的控制台窗口进行验证),每次我请求查看/URL 时,我都会得到缓存的版本,并且断点再也不会命中。

这种行为让我相信 CACHE 部分中的任何内容都将覆盖或忽略 NETWORK 部分中的任何内容,但就像我说的(以及我在这里问的原因)是因为我是新手,我'不确定这是否是它应该工作的方式,或者我是否遗漏了某些东西或没有正确使用它。

任何帮助是极大的赞赏

这是 cache.manifest 的相关部分:

CACHE MANIFEST
#V1.0
CACHE:
/
/Content/Site.css
/Content/themes/base/jquery-ui.css

NETWORK:
*
/

FALLBACK:
4

1 回答 1

3

事实证明,html5 appcache 或清单缓存的工作方式与我预期的不同。

这是whatwg.org的引文,很好地解释了它:

离线网络应用程序

如果应用程序逻辑与应用程序和用户数据是分开的,并且逻辑(标记、脚本、样式表、图像等)在清单中列出并存储在应用程序缓存中,应用程序缓存功能最有效,并且数量有限。应用程序的静态 HTML 页面,以及存储在 Web 存储或客户端索引数据库中的应用程序和用户数据,使用 Web 套接字、XMLHttpRequest、服务器发送事件或其他类似机制动态更新。

然而,遗留应用程序倾向于将用户数据和逻辑在 HTML 中混合在一起,每个操作都会从服务器产生一个新的 HTML 页面。

混合内容模型不适用于应用程序缓存功能:由于内容被缓存,这将导致用户总是看到上次缓存更新时的陈旧数据。

虽然没有办法让遗留模型像分离模型一样快速工作,但至少可以使用首选在线应用程序缓存模式对其进行改造以供离线使用。为此,请在应用程序缓存清单中列出您希望离线工作的 HTML 页面使用的所有静态资源,使用 manifest 属性从 HTML 文件中选择该清单,然后在底部添加以下行显现:

SETTINGS:
prefer-online
NETWORK:
*

因此,事实证明,应用程序缓存不适合在服务器上呈现动态信息的页面。whatwg.org 将这些类型的应用程序称为“遗留”。

为了自然地适应应用程序缓存,您只需要在 html 页面上有显示和通用逻辑,并通过 ajax 请求检索任何动态信息。

希望这可以帮助。

于 2013-05-09T02:52:55.300 回答