2012-07-02 6 views
5

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); 

    } 
} 
+0

¿Y qué ocurre si alguna vez quiere cambiar la imagen? – nunespascal

+2

@nunespascal Una imagen modificada obtendrá una nueva identificación. –

Respuesta

3

está bien, desde el momento en que se obtiene el If-Modified-Since el recurso es en el navegador y usted decide si lo deja como está.

Me gusta decir que ustedes dos piensan. No parece que haya configurado este encabezado, por lo que probablemente no lo obtenga en el navegador.

Para hacer esta obra real que necesita para añadir esta línea

context.Response.AddHeader("If-Modified-Since", LastModifledOfImage.ToString()); 

o como usted envía la corriente de fecha y hora:

context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString()); 

cuando se envía la imagen. Veo que you use the SetLastModified pero se establece el encabezado Last-Modified no el que marque.

considerar para hacer realidad estas imágenes estáticas, si es posible, porque incluso esta If-Modified-Since hacer una llamada al servidor, pero el recurso realidad estática tiene la imagen directa de la caché del navegador con el servidor pidiendo a cabo.

+1

Gracias por la sugerencia de incluir el encabezado en nuestra respuesta del servidor. –

2

Por la especificación:

Si el cliente ha realizado una petición GET condicional y se le permite el acceso, pero el documento no ha sido modificado, el servidor debe responder con este código de estado.

Así que sí, parece que esas condiciones están satisfechas. Asegúrese de incluir nuevamente el encabezado Fecha en su respuesta.

+0

+1 para la referencia a la especificación –

Cuestiones relacionadas