7

iPhone で NSURLConnection 非同期接続を使用したリクエスト キャッシュに小さな問題があります。何かを間違って理解しているのか、それとも Cocoa が本来の動作とは逆のことを行っているのかはわかりません...

NSURLRequest のドキュメントには、次のように記載されています。

NSURLRequestReloadIgnoringLocalCacheData

URL ロードのデータを元のソースからロードする必要があることを指定します。URL ロード要求を満たすために、既存のキャッシュ データを使用しないでください。

と:

NSURLRequestReloadIgnoringLocalAndRemoteCacheData

ローカル キャッシュ データを無視するだけでなく、プロトコルで許可されている限り、プロキシやその他の中間体にキャッシュを無視するように指示する必要があることを指定します。

ここで、NSURLRequestReloadIgnoringLocalCacheData (ローカル キャッシュを無視することになっていますが、利用可能な場合はリモート キャッシュを使用することになっています) で NSURLRequest を送信すると、送信されるヘッダーは次のようになります。

GET /ダッシュボード HTTP/1.1
ユーザーエージェント: XBlip1.0 CFNetwork/422.15.2 Darwin/9.6.0 (i386) (iMac8%2C1)
X ブリップ API: 0.02
受け入れる: アプリケーション/json
認可: 基本 (...)
Accept-Language: en-us
Accept-Encoding: gzip、デフレート
接続: キープアライブ
ホスト: api.blip.pl

そして、ステータスは 200 OK です。しかし、名前が示すように、ローカル キャッシュとリモート キャッシュの両方を無視することになっている NSURLRequestReloadIgnoringLocalAndRemoteCacheData を使用すると、ヘッダーが 1 つ追加されます。

一致しない場合: "d751713988987e9331980363e24189ce"

応答は 304 Not Modified です。HTTP RFC を確認したところ、「If-None-Match」については次のように書かれています。

エンティティ タグのいずれかが、そのリソースの同様の GET 要求 (If-None-Match ヘッダーなし) への応答で返されるエンティティのエンティティ タグと一致する場合、(...) サーバーは、してはなりません (MUST NOT)。要求されたメソッドを実行する (...) 代わりに、要求メソッドが GET または HEAD の場合、サーバーは 304 (Not Modified) 応答で応答する必要があります (SHOULD)。

したがって、リモート キャッシュを無視する代わりに NSURLRequestReloadIgnoringLocalAndRemoteCacheData を使用すると、Cocoa はリモート サーバーにリモート キャッシュ使用するように明示的に指示し、NSURLRequestReloadIgnoringLocalCacheData を使用すると、その行は追加されず、実際にはリモート キャッシュは追加されません。使用済み。

では、ここで何が起こっているのでしょうか。何か見逃していましたか、それとも Cocoa が間違ったヘッダーを設定していますか?

4

3 に答える 3

10

ドキュメントから:

ローカル キャッシュ データを無視するだけでなく、プロトコルで許可されている限り、プロキシやその他の中間体にキャッシュを無視するように指示する必要があることを指定します。

NSURLRequest.h (10.5 SDK) から

ローカル キャッシュ データを無視するだけでなく、プロトコルで許可されている限り、プロキシやその他の中間体にキャッシュを無視するように指示する必要があることを指定します。未実装。

違いに注意してください:未実装

バグ報告の時間...

于 2009-12-18T15:35:37.720 に答える
1

「プロキシとその他の中間体」の部分に注意してください。元のサーバーに存在しないキャッシュを回避しているだけです。元のサーバーは引き続き304を返すことができます。

于 2009-03-25T10:39:22.847 に答える