2009-06-02 1 views

ответ

41

@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 
} 
+3

Это хороший ответ для тех, кто хочет реализовать это, я бы рекомендовал реализовать абстрактный ActionFilter, который реализует эту тестовую логику, и абстрактный метод под названием «абстрактная строка CalculateEtag (HttpRequest)», подклассифицируя его для каждого случая, где вам нужен Etag поддержка. Это позволит вашим методам действий «тощим» и упростить процесс генерации тестирования. –

+0

Что такое магазин в eTagOfContentToBeReturned? как генерировать etag для каждого действия? –

30

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

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

С .net принимает строку как ETAG, вы можете установить его легко с помощью

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

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

ответ
+2

Я думаю, что это не так! потому что добавление статического ETag будет напоминать, что ваш контент никогда не изменится. Идея ETags - позволить браузеру знать, что содержимое изменилось, похожее на заголовки истечения срока. –

+6

Я думаю, что значение harcoded предназначено только для иллюстрации ... вы можете создать что-то «на лету» и изменить его. – Romias

+1

Действительно. Само упоминание использования MD5 предполагает, что он рассчитан (возможно, только когда он изменяется или «на лету каждый раз») и возвращается. Это явно не предложение использовать статическое значение. –