Как поддерживать ETags в ASP.NET MVC?

Как мне поддерживать ETags в ASP.NET MVC?

Ответ 1

@Elijah Glover ответ является частью ответа, но на самом деле не завершен. Это установит ETag, но вы не получите преимуществ ETag без проверки его на стороне сервера. Вы делаете это с:

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

Кроме того, другой совет заключается в том, что вам нужно установить кешируемость ответа, в противном случае по умолчанию он будет закрытым, и ETag не будет установлен в ответе:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);

Итак, полный пример:

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
}

Ответ 2

ETAG в MVC такие же, как WebForms или HttpHandlers.

Вам нужен способ создания значения ETAG, лучший способ, который я нашел, - использовать файл MD5 или ShortGuid.

Так как .net принимает строку как ETAG, вы можете легко ее установить, используя

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

Видео из MIX, в конце они используют ETAG с REST