Tôi đang phục vụ một hình ảnh từ cơ sở dữ liệu bằng IHttpHandler. Mã có liên quan ở đây:Hình ảnh từ HttpHandler sẽ không lưu trong bộ nhớ cache
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;
}
Vấn đề là trình duyệt sẽ không lưu hình ảnh, có lẽ vì tôi không cho biết điều đúng trong tiêu đề phản hồi. Các phương thức gọi một phần trên thuộc tính HttpCachePolicy là những gì tôi nghĩ sẽ buộc trình duyệt giữ lại hình ảnh, nhưng nó không. Tôi nghĩ rằng điều "đúng" là để người xử lý trả lại mã trạng thái 304 mà không có hình ảnh, phải không? Làm thế nào để đạt được điều đó bằng cách sử dụng IHttpHandler?
EDIT:
mỗi câu trả lời tốt nhất, tôi có mã này chạy và nó hoàn toàn giải quyết vấn đề. Có, nó cần một số tái cấu trúc, nhưng nó thường chứng minh những gì tôi đã sau. Các bộ phận liên quan:
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);
Dường như trình duyệt sẽ lưu trong bộ nhớ cache trong 5 phút. Là nó bộ nhớ đệm nó cho dù đó dài? Đó là những gì bạn có ý định? –
Trình duyệt không cache chút nào. Mã này thực hiện mỗi khi yêu cầu được thực hiện. –
Hoàn toàn không liên quan, nhưng bạn có bất kỳ tác động hiệu quả nào khi sử dụng phương pháp này để phân phát hình ảnh không? Đặc biệt là khi bạn phục vụ một số hình ảnh trong một trang web với IHttpHandler của bạn? – jishi