我正在实现一个应用程序,它对我们也控制的 rest-api 进行大量网络调用。最近我们决定在服务器端引入缓存头,以节省一些宝贵的网络和服务器时间。由于我们事先不知道数据的有效期有多长,所以我们没有发送Cache-control: max-age
或Expires
标头,我们所做的只是将Last-Modified
标头与 a 一起发送E-tag
,因此我们总是访问服务器,但大多数时候响应非常快,带有 a 304
. 起初一切似乎都很好,许多请求都被缓存了。但是,由于缓存,我在应用程序上遇到了一些随机数据错误。
出于某种原因,我无法理解,在某些时候,请求被本地缓存并用作“更新”数据而不会命中服务器,而实际上它们不是。问题一直存在,直到一段时间过去。然后一切都再次正常进入服务器,就像它在cache-control
标题中的行为一样,但没有它!。所以,我的问题是:
当原始请求没有附带或标头时NSURLCache
,如何NSURLConnection
确定特定请求不需要上线?有没有人经历过类似的效果?以及如何在不删除整个缓存的情况下解决它?Cache-control: max-age
Expires
更多背景信息:
- 我正在使用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+