iPhone网络应用程序中的缓存控制 - 加载了ajax的页面

时间:2011-09-22 07:30:55

标签: iphone caching iis-7 windows-server-2008

我正在寻找缓存和ajax加载页面的大师: - )

我已经阅读了很多有关该主题的输入,但仍然不确定缓存ajax页面的最佳方法是什么。我想确保尽我所能尽可能快地制作我的iPhone网络应用程序以加载和导航。

这就是我的所作所为: 我正在开发一个带有jqtouch和phonegap的iPhone网络应用程序。 当从App Store下载时,我在应用程序中包含所有js文件,css文件,索引页面和菜单图标。 js和css文件缩小了。

我的所有子页面都是从我的专用服务器加载ajax。 所有子页面都是.asp页面,每次加载页面时都会从mysql数据库中获取其内容。

由于iPhone缓存页面我必须在访问它们时删除所有ajax页面,否则更新将不可见。这不是最好的做事方式。

相反,我不想删除ajax页面并使用cache-controll。

这就是我认为应该如何运作的方式: 打开服务器上的cache-controll(这是怎么做到的?) 在应用程序中,检查Last-Modified日期以及它是否未更改 - 从缓存中读取。 如果更改了 - 从服务器获取文件。

这是最好的做事方式吗?而不是电子标签?

我想知道,如何使用正确的缓存控件将IIS 2008设置为Windows 2008服务器。如何在索引文件中编写正确的头文件,如果我需要在asp的ajax页面中编写som asp-read头文件?

我希望有人现在怎么做? 感兴趣的任何输入,谢谢!

2 个答案:

答案 0 :(得分:2)

对我来说,iPhone在本地缓存页面并且你必须清理缓存以获取新内容听起来很奇怪。

实际上必须有一些HTTP缓存标头告诉iPhone浏览器这样做。 如果浏览器是iOS上的Safari,Android上的Opera或Windows上的Firefox,那应该没关系,因为所有现代浏览器都应该"符合HTTP 1.1 RFC,甚至是移动版。 当然,他们可能会有一些差异来节省带宽,手机电池和手机CPU周期,但他们肯定应该允许用户从网站获取新鲜内容。所以我同意你的意见,清理访问过的页面并不是正确的做事方式。 我绝对认为某处存在问题。尝试通过计算机浏览器调用API并通过firebug或chrome的本机调试工具检查请求,以检查服务器响应标头,并查看行为是否相同。

通常我使用max-age和if-modified-自缓存验证器的混合。 我将某些图像的最大年龄设置为较高的值(在我的情况下为365天,很可能不适合您),对于其他一些图像和一天的css和javascript。 另外我使用if-modified-since所以我在内容的新鲜度,服务器负载和带宽使用之间取得了很好的平衡。 ETAG与if-modified-based基本相同,因为差异你可以将它设置为弱缓存验证器,如果服务器的时钟不可靠,它真的很有用。 (有关详细信息和文档参考,请参阅下面的扩展答案)

要启用缓存,IIS7使您可以使用输出缓存IIS模块轻松实现。 Here is一个关于它的好文档,关于如何启用它,以及内核和用户模式缓存之间的区别。

除非你需要做特别的事情,否则我认为你不需要为它创建代码,IIS会处理所有事情。如果情况并非如此,那么another good guide会帮助您解决问题。

如果您真的想要一个快速网站,那么我建议您启用压缩,并在应用程序和数据库之间添加缓存层。因此,您不会在每次请求时对DB执行查询。

以下是任何网络开发者的some more good performance guidelines

扩展答案(甚至可能过于扩展:))

通过HTTP 1.1有不同的方法在客户端缓存内容。 最常见的,或至少我最常用的是:

  1. 最大年龄
  2. 上次修改
  3. ETAG
  4. 1)max-age头从服务器发送到HTTP响应头,并且基本上告诉客户端的浏览器将内容存储在其缓存中,持续一段时间以秒为单位。 / p>

    例如,假设服务器响应logo.jpg的GET客户端http请求而返回max-age = 60。客户端的浏览器然后存储logo.jpg,并且在接下来的60秒内,它将从其自己的缓存中提供图像。 换句话说,在接下来的60秒内不会有针对此特定图像的HTTP请求。 因此,对于最大年龄,内容将缓存在客户端,并且不会在服务器中请求或重新验证max-age标头中指定的秒数。 然而,通常可以通过在Windows浏览器上按CTRL-F5和在Mac浏览器上按CMD-R来强制进行重新验证/刷新。在移动设备上,通常功能在浏览器菜单上,称为刷新。这是RFC的appropriate section

    <强>赞成

    • 没有TCP连接和HTTP请求到服务器,因此服务器端的工作量减少(如果你的应用有很多用户,真的很有用)
    • 内容直接从浏览器缓存本地加载,因此内容加载没有延迟
    • 没有带宽使用(如果数据中心向您收取入站和出站带宽,则非常有用)

    <强> CONS

    • 如果您在服务器上有新鲜内容,则客户端将不会注意到,直到客户端缓存过期,或者用户强制浏览器刷新。

    2)最后修改的服务器端http响应头与客户端http请求头if-modified-since一起,是加速网站和节省一些钱的另一个好机制。它基本上以这种方式工作。

    浏览器首次通过GET请求向服务器请求内容。 服务器以200响应,并将内容与最后修改的标头一起返回。 最后修改的标题的值只不过是上次修改内容的实际日期和时间。 (由于时区,日期时间必须为UTC) 此时,来自客户端的相同内容的所有以下HTTP请求都将具有一个名为:if-modified-since的附加标头,其中从服务器接收的日期和时间为值。 收到以下请求时,服务器将检查if-modified-since标头值,并将其与内容的上次​​修改日期进行比较。 如果数据相同,因此内容没有改变,服务器将以304响应,基本上没有内容。 (最重要的部分!) 然后浏览器知道它必须保留缓存中的内容并从中加载它,因为它在服务器端没有改变。 该过程将继续,直到服务器上的内容发生更改,因此服务器将提供新的上次修改日期和新内容。 正如您所看到的,这可以节省大量带宽,尤其是在图像或JS或css的情况下,而不会放弃内容的新鲜度。 Section 14.25 of the spec比我更好地解释了事情。 :)

    <强>赞成

    • 整个过程中涉及的带宽较少,如果内容未更改,则服务器仅响应304.
    • 从客户端重新验证内容,因此客户端将始终拥有最新的新数据

    <强> CONS

    • 服务器必须处理TCP连接和HTTP请求,并检查客户端请求的文件/内容的上次​​修改日期和时间。

    3)ETAG是一个类似于if-modified-since的过程,区别在于标头的值通常是服务器端内容的散列,而http请求上的客户端发送一个名为的标头:如果 - 无匹配。

    优缺点与第2点相同。

    您现在可能想知道点2和点3之间的主要区别是什么。 第2点的问题实际上是服务器时钟。实际上,如果有时钟问题,可能会出现从服务器返回上次修改日期的问题


    主题更深入,因为最佳做法是发送一个弱而强的验证器。有关详细信息,请参阅section 13.3.4

答案 1 :(得分:1)

我刚刚发现了有关safari缓存与网络应用交互的其他信息。

这里是link

似乎需要在清单文件中指定要缓存的内容。

此外,该链接还解释了如何通过javascript触发缓存失效和内容刷新。