Internet Explorer отображает данные кэша через Ajax Pull с 304 результатом

StackOverflow https://stackoverflow.com/questions/8855337

Вопрос

У меня есть инструмент, который отлично работает в 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 GETS, если вы не скажете это не делать.

Вы говорите не через 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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top