2009-06-02 11 views

Respuesta

41

de @Elijah Glover es parte de la respuesta, pero no realmente completa. Esto configurará el ETag, pero no obtendrá los beneficios de ETag sin verificarlo en el servidor. Usted lo hace con:

var requestedETag = Request.Headers["If-None-Match"]; 
if (requestedETag == eTagOfContentToBeReturned) 
     return new HttpStatusCodeResult(HttpStatusCode.NotModified); 

Además, otro consejo es que usted necesita para configurar el almacenamiento en caché de la respuesta, de otro modo por defecto es "privado" y la ETag no se establecerá en la respuesta:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); 

Así un ejemplo completo:

public ActionResult Test304(string input) 
{ 
    var requestedETag = Request.Headers["If-None-Match"]; 
    var responseETag = LookupEtagFromInput(input); // lookup or generate etag however you want 
    if (requestedETag == responseETag) 
     return new HttpStatusCodeResult(HttpStatusCode.NotModified); 

    Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); 
    Response.Cache.SetETag(responseETag); 
    return GetResponse(input); // do whatever work you need to obtain the result 
} 
+3

Esta es una buena respuesta, para aquellos que deseen implementar esto, yo recomendaría la aplicación de un ActionFilter abstracta que implementa esta lógica prueba y un método abstracto llamado "cadena abstracta CalculateEtag (HttpRequest)", la subclasificación que para cada caso en el que necesita Etag apoyo. Esto mantendrá sus métodos de acciones "delgados" y facilitará la prueba de generación de etag. –

+0

¿Qué es store in eTagOfContentToBeReturned? cómo generar etag para cada acción? –

30

ETAG de MVC en son los mismos que WebForms o HttpHandlers.

Necesita una forma de crear el valor ETAG, la mejor manera que he encontrado es utilizando un archivo MD5 o ShortGuid.

Desde .net acepta una cadena como ETAG, se puede establecer fácilmente usando

String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw" 
Response.Cache.SetETag(etag); 

vídeo de MIX, en el extremo que utilizan ETAG de la RESTO

respuesta
+2

Creo que esto es un error! porque agregar un ETag estático sería como decir que su contenido nunca cambiará. La idea de ETags es dejar que el navegador sabe que el contenido ha cambiado, de forma similar a los encabezados de caducidad .. –

+6

Creo que el valor harcoded es sólo para fines ilustrativos ... se puede crear algo sobre la marcha y cambiarlo. – Romias

+1

De hecho. La sola mención de usar MD5 sugiere que se calcule (tal vez solo cuando se cambia o sobre la marcha cada vez) y se devuelve. Claramente, no es una sugerencia usar un valor estático. –