2011-07-14 35 views
4

我有一个页面,它执行AJAX请求以获取数据,然后由用户修改该数据。当使用iPad时,如果用户做出改变,然后离开页面,然后回来 - AJAX请求不会重新运行 - 这意味着旧数据被加载(推测来自iPad的浏览器缓存)。尽管设置为“无存储”,iPad缓存AJAX响应

我的服务器代码是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 

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

+0

如果可能,请考虑使用POST而不是GET。 – vcsjones

+0

啊,有趣的,谢谢vcsjones。 –

+0

POST可能不是那么有用... http://stackoverflow.com/questions/12506897/is-safari-on-ios-6-caching-ajax-results – meshy

回答

5

如前面的回答提出,jQuery提供了一个简单的选择缓存为它的$.ajax method

如果设置为false,这将迫使要求不被 浏览器缓存的网页。将缓存设置为false还会将查询字符串参数 “_ = [TIMESTAMP]”附加到URL。

因此,例如:

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

如果你不使用jQuery你可以实现你自己的类似行为。

+0

+1非常有趣。我已经在使用我在答案中列出的解决方案,但如果我再次这样做(考虑使用jQuery),我一定会使用这个答案。 –

+0

此答案不适用于iOS 6,请参阅此处:http://stackoverflow.com/questions/12506897/is-safari-on-ios-6-caching-ajax-results –

0

我目前的解决办法是不断地(略)修改AJAX请求的URL:

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

因为查询字符串传递到同一网页的方法,每次,我可以忽略它的价值,但Safari浏览器不能缓存结果,因为它总是在不同的地址。

虽然这不是最好的解决方案!

+0

这是一个非常常见的解决方案,在我的书中它是肯定比用'POST'替换'GET'更好。 –

+0

我没意识到这很普遍。感谢您的保证:) –

+0

@Vasiliy Faronov:有*许多原因使用POST而不是GET。仅举几例:1)如果传递数据,GET将参数放入查询字符串;它不能很好地处理Unicode/UTF-8文本,或者至少是统一的。服务器通常不会在URL中处理像西里尔这样的东西。 POST没有这个限制。 2)如果你不希望它缓存;任何其他许多人......现在,这不是说GET是坏的;但有很多理由使用POST。 – vcsjones