【发布时间】:2013-09-05 09:05:43
【问题描述】:
我正在实现一个应用程序,它对我们也控制的 rest-api 进行大量网络调用。最近我们决定在服务器端引入缓存头,以节省一些宝贵的网络和服务器时间。由于我们事先不知道数据的有效期有多长,所以我们不会发送Cache-control: max-age 或Expires 标头,我们所做的只是发送Last-Modified 标头和E-tag,所以我们总是点击服务器,但大多数时候使用304 的响应非常快。
起初一切似乎都很好,许多请求都被缓存了。但是,由于缓存,我在应用上遇到了一些随机数据错误。
出于某种我无法理解的原因,有时请求会被本地缓存并用作“更新”数据而不会访问服务器,而实际上它们并非如此。问题一直存在,直到一段时间过去。然后一切都再次正常进入服务器,就像它使用cache-control 标头一样,但没有它!。所以,我的问题是:
当原始请求没有带有Cache-control: max-age 或Expires 标头时,NSURLCache 和NSURLConnection 如何确定特定请求不需要上线?有没有人经历过类似的效果?以及如何在不删除整个缓存的情况下解决它?
更多背景信息:
- 我正在使用AFNetworking,但它依赖于
NSURLConnection,所以我没有 认为它改变了一切 - 使用的缓存是默认的
[NSURLCache sharedURLCache]实例 -
这是一个
GET请求,当我从缓存的响应中检查标头时,我得到的是:po [response allHeaderFields]"Access-Control-Allow-Headers" = "Content-Type"; "Access-Control-Allow-Methods" = "GET, POST, DELETE, PUT"; "Access-Control-Allow-Origin" = "*"; Connection = "keep-alive"; "Content-Encoding" = gzip; "Content-Length" = 522; "Content-Type" = "application/json"; Date = "Mon, 02 Sep 2013 08:00:38 GMT"; Etag = "\"044ad6e73ccd45b37adbe1b766e6cd50c\""; "Last-Modified" = "Sat, 31 Aug 2013 10:36:06 GMT"; Server = "nginx/1.2.1"; "Set-Cookie" = "JSESSIONID=893A59B6FEFA51566023C14E3B50EE1E; Path=/rest-api/; HttpOnly"; 我无法预测或重现错误何时发生,因此无法选择依赖删除缓存的解决方案。
- 我使用的是 iOS5+
【问题讨论】:
-
设备和服务器之间不可能存在时钟同步问题? Specs 说在这种情况下客户端的行为是不确定的(由客户端做适当的事情)。您是否也尝试过检测afnetworking 代码只是为了获得更多洞察力?
-
时间问题是我的第一个想法,但我找不到可重复的场景(它非常随机地发生)。无论如何,它发生在具有适当时间的设备上,服务器端也是正确的,所以它似乎不是这样 :( 感谢您的提示!
标签: ios caching nsurlconnection afnetworking nsurlcache