Как поддерживать ETags в ASP.NET MVC?Как поддерживать ETags в ASP.NET MVC?
ответ
@Elijah Гловер является частью ответ, но не совсем полный. Это установит ETag, но вы не получите преимущества ETags, не проверив его на стороне сервера. Вы делаете это с:
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
}
ETAG в MVC такие же, как WebForms или HttpHandlers.
Вам нужен способ создания значения ETAG, лучший способ, который я нашел, - использовать файл MD5 или ShortGuid.
С .net принимает строку как ETAG, вы можете установить его легко с помощью
String etag = GetETagValue(); //e.g. "00amyWGct0y_ze4lIsj2Mw"
Response.Cache.SetETag(etag);
видео с MIX, в конце концов, они используют ETAG с REST
ответЯ думаю, что это не так! потому что добавление статического ETag будет напоминать, что ваш контент никогда не изменится. Идея ETags - позволить браузеру знать, что содержимое изменилось, похожее на заголовки истечения срока. –
Я думаю, что значение harcoded предназначено только для иллюстрации ... вы можете создать что-то «на лету» и изменить его. – Romias
Действительно. Само упоминание использования MD5 предполагает, что он рассчитан (возможно, только когда он изменяется или «на лету каждый раз») и возвращается. Это явно не предложение использовать статическое значение. –
Это хороший ответ для тех, кто хочет реализовать это, я бы рекомендовал реализовать абстрактный ActionFilter, который реализует эту тестовую логику, и абстрактный метод под названием «абстрактная строка CalculateEtag (HttpRequest)», подклассифицируя его для каждого случая, где вам нужен Etag поддержка. Это позволит вашим методам действий «тощим» и упростить процесс генерации тестирования. –
Что такое магазин в eTagOfContentToBeReturned? как генерировать etag для каждого действия? –