web-dev-qa-db-fra.com

Comment prendre en charge les ETags dans ASP.NET MVC?

Comment prendre en charge les ETags dans ASP.NET MVC?

61
Patrick Gidich

@ réponse d'Elijah Glover fait partie de la réponse, mais pas vraiment complète. Cela définira l'ETag, mais vous n'obtenez pas les avantages des ETags sans le vérifier côté serveur. Vous faites cela avec:

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

En outre, une autre astuce est que vous devez définir la mise en cache de la réponse, sinon par défaut, elle est "privée" et l'ETag ne sera pas défini dans la réponse:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);

Donc, un exemple complet:

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
}
43
jaminto

Les ETAG dans MVC sont les mêmes que les WebForms ou les HttpHandlers.

Vous avez besoin d'un moyen de créer la valeur ETAG, le meilleur moyen que j'ai trouvé est d'utiliser un fichier MD5 ou ShortGuid .

Étant donné que .net accepte une chaîne comme ETAG, vous pouvez la définir facilement en utilisant

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

Vidéo de MIX , à la fin, ils utilisent des ETAG avec REST

30
Elijah Glover