0

我正在使用一个特别昂贵的(就查询和带宽而言),将其视为项目目录。但是,目录还需要始终完全准确,即目录的更新需要实时反映,因此固定的缓存到期期限将不起作用。

客户当前正在使用 JQuery 1.8.2 请求目录,就像这样:

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "http://myserver.com/somejsonquery.aspx",
        data: {},
        dataType: "json",
        success: function ( ... ) { ... },
        error: function ( ... ) { ... }
        });

结果是格式正确的 JSON,内容类型为“application/json”。

由于我在服务器端维护了一个可靠的缓存,我真的很想实现 If-Modified-Since 语义,以便我的服务器可以在缓存是当前的(不会导致数据库或网络命中)时返回 304,并且只发送如果自“If-Modified-Since”时间戳后发生重新加载,则向客户端提供新目录。

但是,我无法让它工作(至少在 IE 上)。我尝试设置以下内容,但仍然无法让客户端发送 If-Modified-Since:

  • 在 JSON 请求上设置“缓存:真”
  • 使服务器在响应中返回“Cache-control: private”HTTP 标头

任何对此有任何见解的人?

作为后续,我还想知道如果我将 Cache-control 设置为“public”(即可由代理服务器缓存),缓存一致性是否仍会通过代理维护?即每次客户端请求该页面时,代理都会检查回我的服务器。如果我要启用代理缓存,我需要完全确定代理将保证一致的缓存状态。

我已经坚持了一段时间,所以任何帮助将不胜感激!

谢谢,-K。

4

2 回答 2

1

我终于弄明白了。原来我需要进行以下更改:

客户端 jQuery:

  • 在我的 AJAX 调用中使用“GET”而不是“POST”。看来 POST 不应该被缓存并且是正确的。
  • 忘记在 AJAX 调用中设置“cache: true”——如果你想使用浏览器缓存,这无关紧要。仅当您想推出自己的客户端缓存系统时才重要。

服务器端:

  • 始终发送 Last-Modified 标头
  • 始终发送“缓存控制:私有,max-age=1”
  • 检查客户端的“If-Modified-Since”标头,如果未修改,则返回 304 且无负载,否则返回 200 并返回结果集。

使用上述逻辑,我将浏览器缓存设置为 1 秒后过期,并将依赖服务器权威决定是否需要使用 304 代码返回新目录。似乎在 IE 上运行良好。

请注意 Brad 上面关于 Apple 移动浏览器行为不端的评论。由于我的用户中只有一小部分会使用 Apple 移动设备,因此我决定保留浏览器缓存,因为它的好处实在是太不可思议了,不容忽视,但尝试在特殊情况下仅对 Apple 移动浏览器强制“无缓存” .

于 2013-03-02T22:59:42.713 回答
1

让缓存头等跨浏览器兼容并不是一门精确的科学。如果你不介意受到网络攻击,试试这个。

1) 将唯一 id 附加到您的目录并将其发送给客户端,并在您的 ajax 请求中返回。

2) 测试该唯一 ID 是否与您的缓存目录的最新版本匹配。如果是,则返回 304 响应代码,否则返回新目录以及新的唯一 ID。

于 2013-03-01T17:51:31.363 回答