Я обслуживаю изображение из базы данных с помощью 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);