Sto servendo un'immagine da un database utilizzando un IHttpHandler. Il codice di riferimento è qui:Immagine da HttpHandler non memorizzerà la cache nel browser
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;
}
Il problema è che il browser non memorizza nella cache l'immagine, presumibilmente perché non sto indicando la cosa giusta nelle intestazioni di risposta. I metodi di chiamata delle parti sulla proprietà HttpCachePolicy sono ciò che pensavo avrebbe forzato il browser a mantenere l'immagine, ma non lo è. Penso che la cosa "giusta" sia che il gestore restituisca un codice di stato 304 senza un'immagine, giusto? Come ottengo quello usando IHttpHandler?
EDIT:
Per la migliore risposta, ho ottenuto questo codice in esecuzione e si risolve completamente il problema. Sì, ha bisogno di qualche refactoring, ma generalmente dimostra quello che cercavo. Le parti rilevanti:
Sembra che il browser debba memorizzarlo nella cache per 5 minuti. Lo sta memorizzando nella cache anche per così tanto tempo? È questo che intendi? –
Il browser non memorizza nella cache. Questo codice viene eseguito ogni volta che viene effettuata la richiesta. –
Completamente non correlato, ma hai delle implicazioni sulle prestazioni quando usi questo approccio per servire le immagini? Soprattutto quando servi più immagini in una pagina web con IHttpHandler? – jishi