Это то, для чего предназначены ETag , If-None-Match (или If-Not-Modified) и HTTP 304.
Если файл отправляется с заголовком 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"));
}
}