Это то, что ETag, If-None-Match (или If-Not-Modified), и HTTP 304 resopnses.
Если файл отправлен с заголовком ETag и допустимой политикой кэширования, браузер будет кэшировать файл, и для каждого последующего запроса будет отправлен заголовок If-None-Match.
Веб-сервер должен проверить, что сгенерированный ETag файла соответствует запросу If-None-Match, и возвращает либо HTTP 200 с новым контентом, либо HTTP 304, указывающий, что кэшированная версия все еще актуальна.
Вот как я, используя его в ASP.NET MVC 1.0:
public ActionResult ViewAvatar(long id)
{
UserAvatar avatar = this.AppManager.GetUserAvatar(id);
if (avatar != null && true)
{
byte[] imageData = avatar.Avatar.ToArray();
string eTag = LanLordzApplicationManager.CalculateMd5(imageData);
if (this.Request.Headers["If-None-Match"] == eTag)
{
return this.NotModified(
HttpCacheability.Public,
DateTime.Now.AddMinutes(2)
);
}
string mimeType = this.AppManager.GetImageMimeType(imageData);
return this.Image(
imageData,
mimeType,
HttpCacheability.Public,
DateTime.Now.AddMinutes(2),
eTag
);
}
else
{
return this.HttpError(404, this.View("NotFound"));
}
}
+1: Да, я пропустил сторону отказа от кэша. –