Internet Explorer通过Ajax Pull显示缓存数据,结果为304

本文关键字:数据 结果 缓存 显示 Explorer 通过 Ajax Pull Internet | 更新日期: 2023-09-27 18:20:10

我有一个在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来做这件事,但问题也发生了,所以你可以忽略它。我还尝试通过一个简单的<img>和一个jQuery触发器来更改整个ImageActionLink,没有任何区别。

结果是,当用户单击Edit链接时,它将对ActionResult的"AddOrEditCriteria"进行ajax调用,找到标准,并将PartialView表单显示回div"#AddOrEditCriteriaFormContainer"中。到目前为止还不错,这在所有浏览器中都能正常工作。

但是,当我第二次点击该编辑时,IE并没有调用ajax,而是简单地显示缓存中的PartialView,当所有其他浏览器再次正确提取数据时(这是必需的,因为该视图允许编辑标准,它可能同时被其他人编辑)。

奇怪的是,IE正在进行调用,但不知何故,它从未到达服务器,它只是通过使用Result304来使用缓存。你可以从这个网络捕获中看到:

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的回报。

我找到了一种方法来修复它,方法是在ajax调用中添加一个带有随机数的"breakcache"参数,但这似乎不是一个好的解决方案。

这个问题一直困扰着我们的用户,因为他们看到的数据不应该因为IE而更新。

Internet Explorer通过Ajax Pull显示缓存数据,结果为304

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);
    }
}