3

ブラウザに画像を返すカスタム ハンドラがあります。

画像はデータベースから取得されます。

何らかの理由で画像がブラウザによってキャッシュされていないため、誰かが以下のコードに欠けているものを見つけることができるかどうか疑問に思っていました:

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はいつも同じ
  • 同じPCの同じブラウザで、標準のIISパイプと私のパイプを介して同じファイルをロードすることをテストしています。通常、IIS を介して読み込まれるファイルはキャッシュされますが、私のファイルはキャッシュされません。

編集 2:通常の IIS ルートで HTTP 要求/応答を調べた後、ETag と関係があると思います。ETag(私は今のところ初めてです)は、ドキュメントの一種のチェックサムのようです。ブラウザーによる後続の要求で ETag が送信され、サーバーが ETag が変更されていないことを検出した場合、サーバーは 304 - Not Modified を返します。すべて良い!しかし、私は今、次を使用してETagを設定しています:

HttpContext.Current.Response.Cache.SetETag(imgRepGetCache.DateCached.ToString());

しかし、それは応答に表示されません。クローザー...

編集 3: HTTP 検査の楽しみのために Firebug を利用した後、最終的に修正しました。以下に私の解決策を投稿しました。

4

3 に答える 3

3

わかりました、修正しました。

これが私が他の人のために、そして私自身の将来の参考のためにしたことです:

// 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
}

魅力的です!

ここで潜在的な問題を発見した場合は、お知らせください。これを更新できます。

明らかなものを先取りするために-画像が新しいかどうかを識別するために、日付文字列に100%依存できます(私の特定のシナリオでは)。

于 2009-06-08T01:22:55.923 に答える
0

あなたの投稿では何も言及されていませんが、これは https:// アドレスですか? セキュリティ上の理由から、ブラウザーは https サイトの画像やページをキャッシュしません。

于 2009-06-08T01:04:01.640 に答える
0

応答の生成で考慮する必要があるのは、次のとおりです。

  • ETag
  • 期限切れ

依頼を受ける際の注意点は以下のとおりです。

  • 最終更新日
  • イフマッチ
  • 一致しない場合
  • If-Modified-Since
  • If-Unmodified-Since
  • 変更されていない限り

次の http メソッドについても考慮する必要がある場合があります。

  • 得る

これは、ニーズに合わせてリファクタリングするのがかなり簡単なソリューションです: http://code.google.com/p/talifun-web/wiki/StaticFileHandler

ファイルシステムからファイルを読み取り、メモリ内のキャッシュに配置するため、データベースから読み取るように変更するだけです。簡単な仕事のはずです。

于 2010-02-18T16:59:13.203 に答える