2009-06-02 10 views

risposta

41

@Elijah Glover è parte di la risposta, ma non veramente completa. Questo imposterà l'ETag, ma non otterrai i benefici di ETags senza controllarlo sul lato server. Di farlo con:

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

Inoltre, un altro suggerimento è che è necessario impostare la cacheability della risposta, altrimenti di default è "privato" e l'ETag non sarà impostato nella risposta:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); 

Quindi, un esempio 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

Questa è una buona risposta, per coloro che cercano di implementare questo, consiglierei di implementare un ActionFilter astratto che implementa questa logica di test, e un metodo astratto chiamato "abstract string CalculateEtag (HttpRequest)", sottoclassi per ogni caso in cui è necessario Etag supporto. Ciò manterrà i tuoi metodi di azione "magri" e faciliterà la verifica della generazione degli effetti. –

+0

cosa si memorizza in eTagOfContentToBeReturned? come generare etag per ogni azione? –

30

Gli ETAG in MVC sono gli stessi di WebForms o HttpHandlers.

È necessario un modo per creare il valore ETAG, il modo migliore che ho trovato è utilizzare un file MD5 o ShortGuid.

Dal .net accetta una stringa come ETAG, è possibile impostare facilmente usando

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

Video da MIX, alla fine usano ETAG di con il riposo

risposta di
+2

Penso che questo è sbagliato! perché aggiungere un ETag statico sarebbe come dire che il tuo contenuto non cambierà mai. L'idea di ETags è di far sapere al browser che il contenuto è cambiato, simile alle intestazioni di scadenza .. –

+6

Penso che il valore di harcoded sia solo a scopo illustrativo ... puoi creare qualcosa al volo e cambiarlo. – Romias

+1

Infatti. La stessa menzione dell'utilizzo di MD5 suggerisce che è calcolato (forse solo quando viene cambiato o al volo ogni volta) e restituito. Non è chiaramente un suggerimento per usare un valore statico. –