我使用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