手机版

如何解决Ajax请求结果的缓存问题

时间:2021-11-23 来源:互联网 编辑:宝哥软件园 浏览:

默认情况下,IE缓存请求地址的Ajax请求结果。换句话说,在缓存过期之前,对同一个地址的多个Ajax请求只会第一次发送到服务器。在某些情况下,这种默认的缓存机制不是我们想要的(比如获取实时数据)。本文将简要讨论这个问题,并介绍几种解决方案。1.问题再现2。通过给URL地址添加后缀来解决问题3。通过JQuery Ajax设置解决问题4。通过定制回答解决问题1。问题再现我们使用ASP.NET的一个MVC应用程序来再现IE对Ajax请求结果的缓存。在一个空的ASP.NET MVC应用程序中,我们定义了以下默认的HomeController,它包括一个返回当前时间的Action方法GetCurrentTime。复制的代码如下:公共类home controller : controller { public action result index(){ return view();}公共字符串GetCurrentTime() {返回DateTime。now . ToLongTimeString();}}对应于默认操作方法索引的视图定义如下。每五秒钟,我们使用JQuery在Ajax中调用GetCurrentTime,并显示返回的结果。复制代码如下:DOCTYPE html html head title@ViewBag.Title/title脚本类型=' text/JavaScript ' src=' http : @ URl。coutent(" ~/Scripts/jquery-1 . 7 . 1 . min . js ")'/script script type=' text/JavaScript ' $(function(){ window . setinterval(function(){ $)。Ajax({ Url : ' @ Ul。操作(' GetCurrentTime ')',success:函数(结果){ $('ul ')。追加(' li '结果'/Li ');} });}, 5000);});/script/head body ul/ul/body/html用不同的浏览器运行这个程序会得到不同的输出结果。如下图所示,实时时间可以在Chrome浏览器中显示,但IE中显示的时间是一样的。

第二,通过给URL地址添加后缀来解决问题。由于IE对于Ajax请求的返回结果是根据请求的地址进行缓存的,如果我们不希望这种缓存机制生效,我们可以在每次请求时给请求的地址添加不同的后缀来解决这个问题。对于这个例子,我们通过下面的代码给请求地址添加一个基于当前时间的查询字符串,再次运行程序后,实时时间会显示在IE中。复制代码如下:DOCTYPE html html头脚本类型=' text/JavaScript ' $(function(){ window . setinterval(function(){ $)。Ajax({ Url : ' @ Ul。操作(' GetCurrentTime ')?'新日期()。toTimeString(),success:函数(结果){ $('ul ')。追加(' li '结果'/Li ');} });}, 5000);});/脚本/头部/html三。通过jQuery的Ajax设置解决问题。事实上,jQuery对此有Ajax设置,所以我们只需要调用$。ajaxSetup方法以下面的方式禁用了Ajaz的缓存机制。复制代码如下:DOCTYPE html html头脚本类型=' text/JavaScript ' $(function(){ $)。AJaxsetup({ cache : false });window.setInterval(函数(){ $)。Ajax({ Url : ' @ Ul。操作(' GetCurrentTime ')',success:函数(结果){ $('ul ')。追加(' li '结果'/Li ');} });}, 5000);});/script /head /html事实上,jQuery的这种机制是通过在请求地址中添加不同的查询字符串后缀来实现的,这可以通过Fiddler截获的请求来证明。

四、通过定制响应解决问题我们可以通过请求的响应来控制浏览器针对结果的缓存,为此我们定义了如下一个名为NoCacheAttribute的动作过滤器。在实现的已执行方法中,我们调用当前HttpResponse的SetCacheability方法将缓存选项设置为NoCache。该NoCacheAttribute特性被应用到GetCurrentTime方法后,运行我们的程序在工业管理学(工业工程)中依然可以得到实时的时间。复制代码代码如下:公共类HomeController :控制器{公共操作结果索引(){返回视图();} [NoCache]公共字符串getcurrentime(){ 0返回日期时间.现在。ToLongTimeString();} }公共类NoCacheAttribute :筛选器属性,IActionFilter { public void onationexecuted(ActionExecutedContext筛选器上下文){ filter context .HttpContext。回应。缓存。setcacheable(httpcacheable .NoCache);} action executing上的public void(action executing上下文筛选器上下文){ } }实际NoCacheAttribute特性最终控制消息消息的缓存控制报头,并将其设置为"无缓存",指示浏览器不要对结果进行缓存。如下所示的是针对GetCurrentTime请求的响应消息:复制代码代码如下:HTTP/1.1 200 OK服务器: ASP。网开发服务器/10.0.0.0日期: 2013年一月3日星期四12:54:56 GMT X-AspNet-版本: 4。0 .30319 X-AspNetMvc-3360 4.0版缓存-控制:无缓存实用程序:无缓存期满字符集=utf-8内容-长度: 10连接:关闭8:54:56下午静守己心,看淡浮华

版权声明:如何解决Ajax请求结果的缓存问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。