カスタム配信された画像がブラウザーにキャッシュされないのはなぜですか?
-
12-09-2019 - |
質問
ブラウザに画像を返すカスタム ハンドラーがあります。
画像はデータベースから取得されます。
何らかの理由で画像がブラウザーによってキャッシュされないので、誰かが以下のコードで欠けている部分を見つけてくれないかと思いました。
HttpContext.Current.Response.BinaryWrite(imageBytes);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
Context.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);
if(imgRepGetCache.DateCached.HasValue)
HttpContext.Current.Response.Cache.SetLastModified(imgRepGetCache.DateCached.Value);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(2));
HttpContext.Current.Response.ContentType = "image/jpeg";
あるいは、私が要点を完全に見逃していて、別の場所に目を向ける必要がある場合。
編集: 詳細情報のリクエストに応じて:
- URLはいつも同じです
- 標準の IIS パイプと自分のパイプを介して同じファイルを同じ PC 上の同じブラウザにロードすることをテストしています。通常、IIS 経由で読み込まれるファイルはキャッシュされますが、私のファイルはキャッシュされません。
編集2: 通常の IIS ルート上の HTTP リクエスト/レスポンスを検査した結果、ETag に関係があると思います。ETag (今のところ初めて知りました) は、ドキュメントのチェックサムのようなもののようです。ブラウザによる後続のリクエストでは ETag が送信され、サーバーが ETag が変更されていないことを検出すると、304 - Not Modified を返します。大丈夫です!ただし、現在は次を使用して ETag を設定しています。
HttpContext.Current.Response.Cache.SetETag(imgRepGetCache.DateCached.ToString());
しかし、それは応答には表示されません。クローザー...
編集3: Firebug を利用して HTTP 検査を楽しんだ後、最終的にこの問題を修正しました。私の解決策を以下に投稿しました。
解決
OK、私はそれを修正します。
ここでは、私は誰のために、私自身の今後の参考のためにやったことです
// Check for repeated request for the same image from a browser
if (HttpContext.Current.Request.Headers.Get("If-None-Match") == imgRepGetCache.DateCached.Value.ToString())
{
// Return 304 - Not Modified
HttpContext.Current.Response.Status = "304 Not Modified";
}
else
{
if (imgRepGetCache.DateCached.HasValue)
HttpContext.Current.Response.Headers.Set("Etag", imgRepGetCache.DateCached.Value.ToString());
// ... do my other stuff here
}
の魅力を作品!
誰もがここに潜在的な問題をスポットした場合、私はので、私はこれを更新することができます知ってみましょう。
横取りするために1つの明白な1 - 。私は100%の画像が(私の特定のシナリオで)新しいかどうかを識別するための日付文字列に依存することができます。
他のヒント
あなたはそれについてのあなたのポストには何も言及していないが、これは、HTTPSです://アドレス?ブラウザはセキュリティ上の理由により、HTTPSサイトから画像やページをキャッシュしません。
応答の生成時に考慮する必要があることは次のとおりです。
- Eタグ
- 有効期限が切れます
リクエストを受け取るときに考慮する必要があることは次のとおりです。
- 最終更新日
- If-Match
- 一致しない場合
- 変更された場合-以降
- 変更されていない場合、以降
- 変更されない限り、それ以降
次の http メソッドについても考慮する必要がある場合があります。
- 得る
- 頭
以下は、ニーズに合わせてリファクタリングが簡単なソリューションです。http://code.google.com/p/talifun-web/wiki/StaticFileHandler
ファイル システムからファイルを読み取り、メモリ内のキャッシュに配置するため、データベースから読み取るように変更するだけです。簡単な仕事のはずだ。