我使用IHttpHandler从数据库提供图像。相关的代码是在这里:来自HttpHandler的图片不会在浏览器中缓存
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);
它看起来像浏览器应缓存5分钟。它是否缓存了这么长时间?那是你的意图吗? – 2009-06-15 00:47:38