Asp.Netアプリケーションには、画像の要求を処理するIHttpHandlerがあります。ハンドラーは、画像キャッシュ内の画像を識別する特別なIDで呼び出されます。画像が現金に入れられると、それは決して変わりません。私の質問は:
指定された日付を実際にチェックせずに、「If-Modified-Since」ヘッダーを持つリクエストに対して常にhttpステータスコード304を返すことは問題ありませんか?その理由は、ブラウザにはすでに画像のコピーが必要であるということです(それは、modified-sinceヘッダーを提供していたためです)。
これにより、(まだ)イメージの作成日を追跡しないため、作業が楽になります。
実際のコードは次のとおりです(更新:Aristosが推奨するように、サーバーの応答にif-modifiedヘッダーを含めました):
public void ProcessRequest(HttpContext context)
{
if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"])) {
//Is this okay?
context.Response.StatusCode = 304;
context.Response.StatusDescription = "Not Modified";
return;
}
var thumbnailId = context.Request.QueryString["thumbnail"];
using (var thumbnailCache = new CThumbnailCache()) {
var imageBytes = thumbnailCache.GetImageById(thumbnailId);
context.Response.ContentType = "image/png";
var outputStream = context.Response.OutputStream;
outputStream.Write(imageBytes, 0, imageBytes.Count());
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetLastModified(DateTime.UtcNow);
// added after Aristos post
context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString("r"));
const int maxAge = 86400 * 14; // 14 Tage
context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(maxAge));
context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, maxAge));
context.Response.CacheControl = "private";
context.Response.Cache.SetValidUntilExpires(true);
}
}