iPad尽管设置了“不缓存”,仍会缓存AJAX响应

4

我有一个页面,它通过AJAX请求获取数据,然后由用户修改。在使用iPad时,如果用户进行更改,然后离开该页面,然后再返回 - AJAX请求不会重新运行 - 这意味着加载旧数据(可能是从iPad的浏览器缓存中加载)。

我的服务器代码是ASP.NET表单,并且我已尝试使用所有可以找到的设置来设置无缓存:

Context.Response.Cache.SetNoStore()
Context.Response.Cache.SetETag(New Guid().ToString())
Context.Response.Cache.SetExpires(New DateTime())
Context.Response.Cache.SetNoServerCaching()
Context.Response.Cache.SetCacheability(HttpCacheability.NoCache)
Context.Response.Expires = 0

但是没有运气。有任何想法吗?

如果可能的话,考虑使用POST而不是GET。 - vcsjones
啊,有趣,谢谢vcsjones。 - Ian Grainger
POST可能没有那么有用... https://dev59.com/FGcs5IYBdhLWcg3w433H - meshy
2个回答

5

如前一答案所提出的,jQuery为其$.ajax方法提供了一个简单的选项cache

如果设置为false,它将强制浏览器不缓存请求的页面。将cache设置为false还会在URL末尾添加一个查询字符串参数"_=[TIMESTAMP]"。

例如:

$.ajax({
  url: "test.html",
  cache: false,
  success: function () {
    $(this).addClass("done");
  }
});

如果您没有使用jQuery,您可以自己实现类似的行为。

+1 非常有趣。我已经在我的答案中列出的解决方案中使用了,但如果我再次做这个(考虑到我确实使用jQuery),我肯定会使用这个答案。 - Ian Grainger
这个答案不适用于iOS 6,请参见此处:https://dev59.com/FGcs5IYBdhLWcg3w433H - Brian Ogden

0

我的当前解决方法是不断(轻微地)修改AJAX请求的URL:

url: "/AjaxService.asmx/" + methodName + "?dt=" + new Date().getTime()

由于查询字符串每次都传递给相同的 Web 方法,所以我可以忽略它的值,但 Safari 无法 缓存结果,因为它总是在不同的地址上。

然而,这肯定不是最好的解决方案!


这是一种非常常见的解决方案,在我的书中,这肯定比用 POST 替换 GET 更好。 - Vasiliy Faronov
我没有意识到这是常见的。谢谢你的安慰 :) - Ian Grainger
@Vasiliy Faronov:使用POST而不是GET有很多原因。举几个例子:1)如果您正在传递数据,GET会将参数放在查询字符串中;这不能很好地处理Unicode / UTF-8文本,或者至少不是统一的。服务器通常无法在URL中很好地处理像西里尔字母这样的内容。POST没有这种限制。2)如果您不希望它被缓存;还有许多其他原因...那并不是说GET不好;但是有很多理由要使用POST。 - vcsjones
我不发送信息。那么使用POST的唯一原因是为了避免缓存吗?那么在这种情况下,这个解决方案似乎同样好 - 或者我错过了什么? - Ian Grainger
因为您可以在Ajax请求中设置“cache:false”(请参见上面的答案),所以被踩了。您提出的解决方案明显是一种代码异味。 - Tamas Ionut
@TamasIonut 噢。呃。好的。 - Ian Grainger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接