我正在实现一款应用,该应用会向我们控制的rest-api发送很多网络调用。最近,我们决定在服务器端引入缓存头信息以节省宝贵的网络和服务器时间。由于我们不知道数据有效期有多长,因此我们没有发送“Cache-control: max-age”或“Expires”头信息,而只发送“Last-Modified”头信息和“E-tag”,因此我们总是访问服务器,但大多数情况下响应速度非常快,返回304。
起初似乎一切正常,许多请求都被缓存。然而,由于缓存,我在应用程序中遇到了一些随机数据错误。
由于某种我无法理解的原因,“某些请求在本地被缓存并被用作“更新”的数据而没有访问服务器”,即使他们实际上并没有更新。这个问题一直存在,直到过了一段时间。然后一切又像使用“cache-control”头信息一样正常访问服务器,但却没有使用它!所以我的问题是:
NSURLCache与NSURLConnection如何决定某个请求不需要在线进行访问,而原始请求却没有带有“Cache-control:max-age”或“Expires”头信息?是否有人有类似的经验?如何在不删除整个缓存的情况下解决它?
更多背景信息:
起初似乎一切正常,许多请求都被缓存。然而,由于缓存,我在应用程序中遇到了一些随机数据错误。
由于某种我无法理解的原因,“某些请求在本地被缓存并被用作“更新”的数据而没有访问服务器”,即使他们实际上并没有更新。这个问题一直存在,直到过了一段时间。然后一切又像使用“cache-control”头信息一样正常访问服务器,但却没有使用它!所以我的问题是:
NSURLCache与NSURLConnection如何决定某个请求不需要在线进行访问,而原始请求却没有带有“Cache-control:max-age”或“Expires”头信息?是否有人有类似的经验?如何在不删除整个缓存的情况下解决它?
更多背景信息:
- I am using AFNetworking, but it relies on
NSURLConnection
so I do not think it changes anything - The cache used is the default
[NSURLCache sharedURLCache]
instance It is a
GET
request, and when I check the headers from the cached response this is what I 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";
I can not predict or reproduce when the error is going to happen so solutions that rely on deleting the cache are not an option.
- I am using iOS5+