Я подаю изображение из базы данных, используя 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?
EDIT:
За лучший ответ, я запустил этот код, и он полностью решает проблему. Да, он нуждается в некотором рефакторинге, но в целом он демонстрирует то, что я преследовал. Соответствующие части:
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);