5

HTML5を使用した小さなシングルページアプリケーションに取り組んでいます。1つの機能は、ページに埋め込まれたPDFドキュメントを表示することです。このドキュメントは、リストから選択できます。

今、私はChromeを(最初は、次に他のすべての最新のブラウザーは)ローカルクライアントキャッシュを使用して、サーバーを経由せずにPDFドキュメントの単純なGET要求を実行しようとしています(もちろん初めて以外)。<object>HTMLの要素に「data」プロパティを設定してPDFファイルを要求します。

XMLHttpRequestの実用的な例を見つけました(ではありません<object>)。Chromeの開発者ツール([ネットワーク]タブ)を使用すると、最初のリクエストがサーバーに送信され、次のヘッダーを含む応答が返されることがわかります。

Cache-Control:public,Public
Content-Encoding:gzip
Content-Length:130
Content-Type:text/plain; charset=utf-8
Date:Tue, 03 Jul 2012 20:34:15 GMT
Expires:Tue, 03 Jul 2012 20:35:15 GMT
Last-Modified:Tue, 03 Jul 2012 20:34:15 GMT
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding

2番目のリクエストは、サーバーのラウンドトリップなしでローカルキャッシュから提供されます。これは、私が望んでいることです。

自分のアプリケーションに戻って、ASP-NETMVC4を使用して設定しました

[OutputCache(Duration=60)]

私のコントローラーで。このコントローラーへの最初のリクエスト-URLを使用http://localhost:63035/?doi=10.1155/2007/98732すると、次のヘッダーが生成されます。

Cache-Control:public, max-age=60, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 Jul 2012 20:45:08 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*

2番目のリクエストは、サーバーへの別のラウンドトリップをもたらし、応答ははるかに速くなります(サーバー側のキャッシュを提案しますか?)が、200OKとこれらのヘッダーを返します。

Cache-Control:public, max-age=53, s-maxage=0
Content-Length:238727
Content-Type:application/pdf
Date:Tue, 03 Jul 2012 20:45:13 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*

同じURLに対する3番目のリクエストは、さらに別のラウンドトリップと、これらのヘッダーを含む304応答になります。

Cache-Control:public, max-age=33, s-maxage=0
Date:Tue, 03 Jul 2012 20:45:33 GMT
Expires:Tue, 03 Jul 2012 20:46:06 GMT
Last-Modified:Tue, 03 Jul 2012 20:45:06 GMT
Server:Microsoft-IIS/8.0
Vary:*

私の質問は、目的の動作(つまり、最初のリクエストからX秒以内にクライアントキャッシュからPDFリクエストがいっぱいになる)を取得するために、OutputCache属性をどのように設定する必要があるかということです。

または、<object>要素に「data」プロパティを設定してPDFを表示させるときに、正しく処理されていませんか?

4

2 に答える 2

1

クライアントがキャッシュする義務はありません。各ブラウザーは、独自のヒューリスティックを使用して、オブジェクトをキャッシュする価値があるかどうかを自由に判断できます。結局、キャッシュの使用は、キャッシュの他の使用と「競合」します。

キャッシングは迅速な応答を保証するようには設計されていません。平均して、変更されていない頻繁に使用されるリソースが既に存在する可能性が高くなるように設計されています。あなたがやろうとしていることは、キャッシュが役立つように設計されていることではありません。

あなたが報告した結果に基づいて、2012 年に使用していた Chrome のバージョンは、60 秒で有効期限が切れるオブジェクトをキャッシュするのは無意味であると判断し、一度だけ要求されました。そのため、使用後に最初のコピーを破棄しました。その後、2 回目の要求を行うと、この URL の優先順位が少し高くなり始めました。最近の URL を記憶していて、これが 2 回目の要求であることを確認したに違いありません。コピーをキャッシュに保持していましたが、3 回目の要求が来たときに、サーバーにそれがまだ有効であることを確認するように要求しました(おそらく、有効期限が数秒しか離れていなかったためです)。サーバーは「304 -- 変更されていません -- キャッシュしたコピーを使用してください」と言っていました。PDFを再度送信しませんでした。

私見、これは妥当なキャッシュ動作であり、まもなく期限切れになるオブジェクトです。


PDF がより長く保持される可能性を高めたい場合は、有効期限を遅らせますが、まだ有効かどうかをサーバーに確認する必要があると伝えます。

HTTP Cache-Control ヘッダーを使用している場合、これは次のようになります: private, max-age: 3600, must-revalidate. これにより、サーバーへのラウンドトリップが表示され、ページが有効である限り 304 応答が返されます。データは返されないため、これは迅速な応答である必要があります。ブラウザのキャッシュ バージョンが使用されます。

privateオプションです-このキャッシング動作とは関係ありません-この揮発性PDFが何であれ、特定のユーザーにとってのみ意味があり、共有場所で長時間ぶらぶらしているべきではないと思います。


サーバーとまったく通信しないというパフォーマンスが本当に必要な場合は、その PDF を保持している DOM 要素をドロップするのではなく、非表示/表示するように JavaScript を記述して、再度要求する必要があることを検討してください。

ページの JavaScript コードは、現在ユーザーに表示していなくても、その PDF を貼り付けておきたいことを「理解」する唯一の場所です。

于 2014-08-15T22:56:20.903 に答える
0

OutputCache の Location プロパティを "Client" に設定してみましたか?

[OutputCache(Duration=60, Location = OutputCacheLocation.Client)]

デフォルトでは、location プロパティは "Any" に設定されています。これは、応答がクライアント、プロキシ、またはサーバーにキャッシュされることを意味します。

MSDN OutputCacheLocationの詳細

于 2013-03-07T06:15:16.683 に答える