IHttpHandler を使用してデータベースから画像を提供しています。関連するコードは次のとおりです。
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/jpeg";
int imageID;
if (int.TryParse(context.Request.QueryString["id"], out imageID))
{
var photo = new CoasterPhoto(imageID);
if (photo.CoasterPhotoID == 0)
context.Response.StatusCode = 404;
else
{
byte[] imageData = GetImageData(photo);
context.Response.OutputStream.Write(imageData, 0, imageData.Length);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(5));
context.Response.Cache.SetLastModified(photo.SubmitDate);
}
}
else
context.Response.StatusCode = 404;
}
問題は、おそらく応答ヘッダーで正しいことを示していないため、ブラウザーが画像をキャッシュしないことです。HttpCachePolicy プロパティのメソッドを呼び出す部分は、ブラウザに画像を強制的に保持させると思われるものですが、そうではありません。「正しい」ことは、ハンドラーが画像なしで 304 ステータス コードを返すことだと思いますよね?IHttpHandler を使用してそれを達成するにはどうすればよいですか?
編集:
最良の回答によると、このコードを実行すると、問題が完全に解決されます。はい、リファクタリングが必要ですが、一般的には私が求めていたものを示しています。関連する部分:
if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"]))
{
CultureInfo provider = CultureInfo.InvariantCulture;
var lastMod = DateTime.ParseExact(context.Request.Headers["If-Modified-Since"], "r", provider).ToLocalTime();
if (lastMod == photo.SubmitDate)
{
context.Response.StatusCode = 304;
context.Response.StatusDescription = "Not Modified";
return;
}
}
byte[] imageData = GetImageData(photo);
context.Response.OutputStream.Write(imageData, 0, imageData.Length);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetLastModified(photo.SubmitDate);