【问题标题】:NSURLCache disregarding max-ageNSURLCache 不考虑 max-age
【发布时间】:2016-02-09 15:29:22
【问题描述】:

我正在使用以下代码从 TfL 下载一些数据。

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                                                      delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.tfl.gov.uk/StopPoint/490012211N/Arrivals"]];

[[session dataTaskWithRequest:req
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if (!error) {
                NSLog(@"Loaded Succesfully");
            }
            NSCachedURLResponse *resp = [[NSURLCache sharedURLCache] cachedResponseForRequest:req];
            if (resp) {
                NSLog(@"Response in cache");
            }
            [[session dataTaskWithRequest:req
                        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                            if (!error) {
                                NSLog(@"Loaded Sucessfully again");
                            }
                        }] resume];
        }] resume];

reponse 的 cache-control 头域是public, must-revalidate, max-age=5, s-maxage=10 这似乎意味着即使第二个请求在 max-age 给定的 5 秒内,服务器也会发送请求。如果我使用 Charles 编辑响应并删除 must-revalidate,那么上面的代码只会向服务器发送一次请求。

HTTP/1.1 规范说

该缓存在条目变得陈旧后不得使用该条目来响应 后续请求,而无需先使用源服务器重新验证它。

对于must-revalidate,但似乎 iOS 似乎忽略了“在它变得陈旧之后”部分?并采用must-revalidate 表示忽略最大年龄。那么与将字段设置为根本不缓存有何不同。我检查了请求/响应正在添加到缓存中,所以看起来must-revalidate 只是膨胀缓存,因为它永远不会使用它,但仍将其添加到缓存中?

那么服务器是否不正确地将must-revalidatemax-age 结合使用,或者iOS 处理must-revalidate 的方式不正确?

有没有办法拦截响应以便我可以删除must-revalidate? NSURLProtocol 似乎很有用,但我只能看到如何修改请求,而不是响应。

【问题讨论】:

    标签: ios objective-c nsurlsession cache-control nsurlcache


    【解决方案1】:

    如果你使用NSURLProtocol,你可以发出一个新的请求(一定要标记它,这样你就不会再次修改它),然后在响应上,你可以在旧的基础上创建一个新的响应对象一,并将修改后的响应发送给客户端。这是否足以解决您的问题,我不确定。

    然而,一个更好的(读作“实现起来更简单”)的解决方案可能是将 NSURLCache 对象子类化,并将您的自定义子类用作共享缓存(用于 NSURLConnection 和 NSURLSession 共享会话)或作为每个会话缓存(用于其他 NSURLSession 会话)。

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2017-08-21
      • 2015-02-14
      • 1970-01-01
      • 2015-08-14
      • 2015-05-02
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多