Come supporto ETags in ASP.NET MVC?Come supporto ETags in ASP.NET MVC?
risposta
@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
}
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 diPenso 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 .. –
Penso che il valore di harcoded sia solo a scopo illustrativo ... puoi creare qualcosa al volo e cambiarlo. – Romias
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. –
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. –
cosa si memorizza in eTagOfContentToBeReturned? come generare etag per ogni azione? –