Internet Explorer отображает данные кэша через Ajax Pull с 304 результатом
-
28-10-2019 - |
Вопрос
У меня есть инструмент, который отлично работает в Chrome и FF. Но с любыми версиями IE браузер отображает информацию о кэше по поводу выполнения Ajax для извлечения данных.
Вот моя установка:
У меня есть критерии, которые я пробегаю:
@foreach (var item in Model)
{
<div class="sizeTDCriteria">
@Html.DisplayFor(modelItem => item.Text)
</div>
<div class="sizeTDCriteriaAction">
@Ajax.ImageActionLink(Url.Content("~/Content/images/icons/edit.png"), "Edit Criteria", "AddOrEditCriteria", "Management", new { competencySectionId = ViewBag.competencySectionId, criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "AddOrEditCriteriaFormContainer" }, new { @class = "iconPosition" })
@Ajax.ImageActionLink(Url.Content("~/Content/images/icons/delete.png"), "Delete Criteria", "RemoveCriteria", "Management", new { criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "CompetenciesManagementWrapper" }, new { @class = "iconPosition" })
</div>
}
ImageActionLink - это всего лишь помощник, который создает ссылку на Actionlink с изображением внутри, я пытался сделать это с обычной линейкой ActionLink, и возникает проблема, так что вы можете игнорировать это. Я также пытался изменить всю ImageActionLink на простые <img>
с триггером jQuery без разницы.
Что происходит, так это то, что когда пользователь нажимает на ссылку «Редактировать», он сделает вызов Ajax в «AddoredItCriteria», который является ActionResult, находит критерии и отображает форму PartialView обратно в Div «#AddorDitcriteriaformContainer». Пока все хорошо, это прекрасно работает во всех браузерах.
Но когда я нажимаю во второй раз в этом редактировании, вместо того, чтобы выполнять вызов AJAX, т.е. просто отображает частичный обзор из того, что он имел в кэше, когда все остальные браузеры снова правильно вытягивают данные (что требуется, так как это представление позволяет Отредактируйте критерии, это могло быть отредактировано кем -то другим).
Странная часть заключается в том, что IE делает вызов, но каким -то образом он никогда не достигает сервера, он просто использует кэш, используя результат 304. Вы можете увидеть из этого захвата сети:
URL Method Result Type Received Taken Initiator Wait?? Start?? Request?? Response?? Cache read?? Gap??
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html 182 B < 1 ms JS Library XMLHttpRequest
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html 182 B < 1 ms JS Library XMLHttpRequest
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 200 text/html 1.53 KB 1.24 s JS Library XMLHttpRequest
Последний - первое, что произошло, первые два были сделаны после и получили возвращение 304.
Я нашел способ исправить его, добавив параметр «BreakCache» в вызов Ajax со случайным числом, но это не кажется хорошим решением.
Эта проблема обладала нашими пользователями, потому что они видят данные, которые не должны обновляться всем из -за IE.
Решение
Т.е. будет кэшировать Ajax GET
S, если вы не скажете это не делать.
Вы говорите не через Cache-Control
заголовок.
Итак, вот что мы делаем:
[CacheControl(HttpCacheability.NoCache), HttpGet]
public ActionResult MyAction() { return Json("Hi!", JsonRequestBehavior.AllowGet); }
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class CacheControlAttribute : ActionFilterAttribute
{
public CacheControlAttribute(HttpCacheability cacheability)
{
this._cacheability = cacheability;
}
public HttpCacheability Cacheability { get { return this._cacheability; } }
private HttpCacheability _cacheability;
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
cache.SetCacheability(_cacheability);
}
}