Когда вы получаете 304, вы должны повторно запросить данные, но с флагом «ifModified», установленным в false.После этого к запросу будут применены обычные правила кэширования, и вы получите кэшированные данные.
Например, в контроллере MVC ...
DateTime pageLastUpdated = <.....>
if (Request.Headers["If-Modified-Since"] != null)
{
var dt = DateTime.Parse(Request.Headers["If-Modified-Since"] as string);
if (pageLastUpdated.Date == dt.Date && pageLastUpdated.Hour == dt.Hour && pageLastUpdated.Minute == dt.Minute && pageLastUpdated.Second == dt.Second) {
Response.Cache.SetCacheability(HttpCacheability.NoCache);
return new HttpStatusCodeResult(304, "notmodified");
}
}
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.Cache.SetVaryByCustom("*");
Response.Cache.SetExpires(pageLastUpdated.AddDays(1));
Response.Cache.SetLastModified(pageLastUpdated);
// now return the Json
return Json(new {........});
Отправленные данные кэшируютсяклиент на срок до 1 дня.
function loadJson(url, params, onLoaded) {
// initial request
$.ajax({
type: 'GET',
dataType: 'json',
url: url,
data: params,
cache: true,
ifModified: true, // forces check with server
success: function (result, textStatus, jqXHR) {
// if 304, re-request the data
if (result === undefined && textStatus == 'notmodified') {
$.ajax({
type: 'GET',
dataType: 'json',
url: url,
data: params,
cache: true,
ifModified: false, // don't check with server
success: function (cachedResult, textStatus, jqXHR) {
onLoaded(cachedResult);
}
});
}
else
onLoaded(result);
}
});