En nuestra aplicación Asp.Net tenemos un IHttpHandler que maneja las solicitudes de imágenes. Se llama al controlador con una identificación especial que identifica una imagen en nuestro caché de imágenes. Una vez que se coloca una imagen en el efectivo, nunca cambia. Mi pregunta es:¿Está bien devolver siempre el estado http 304 para las solicitudes con "If-Modified-Since" si el contenido es estático
¿Está bien devolver siempre el código de estado http 304 para las solicitudes con un encabezado "If-Modified-Since" sin verificar realmente la fecha especificada? El razonamiento es que el navegador ya debe tener una copia de la imagen (ya que proporcionó el encabezado modified-since).
Esto haría la vida más fácil, porque aún no (todavía) rastreamos la fecha de creación de la imagen.
Aquí es el código real (Actualización: Me incluido el encabezado if-modified ahora en la respuesta del servidor según lo recomendado por Aristos):
public void ProcessRequest(HttpContext context)
{
if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"])) {
//Is this okay?
context.Response.StatusCode = 304;
context.Response.StatusDescription = "Not Modified";
return;
}
var thumbnailId = context.Request.QueryString["thumbnail"];
using (var thumbnailCache = new CThumbnailCache()) {
var imageBytes = thumbnailCache.GetImageById(thumbnailId);
context.Response.ContentType = "image/png";
var outputStream = context.Response.OutputStream;
outputStream.Write(imageBytes, 0, imageBytes.Count());
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetLastModified(DateTime.UtcNow);
// added after Aristos post
context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString("r"));
const int maxAge = 86400 * 14; // 14 Tage
context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(maxAge));
context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, maxAge));
context.Response.CacheControl = "private";
context.Response.Cache.SetValidUntilExpires(true);
}
}
¿Y qué ocurre si alguna vez quiere cambiar la imagen? – nunespascal
@nunespascal Una imagen modificada obtendrá una nueva identificación. –