宝哥软件园

Ajax请求结果的IE缓存分析

编辑:宝哥软件园 来源:互联网 时间:2021-10-02

默认情况下,IE缓存请求地址的Ajax请求结果。换句话说,在缓存过期之前,对同一个地址的多个Ajax请求只会第一次发送到服务器。在某些情况下,这种默认的缓存机制不是我们想要的(比如获取实时数据)。本文将简要讨论这个问题,并介绍几种解决方案。

目录

首先,问题再次出现。

第二,通过给URL地址添加后缀来解决问题。

第三,通过JQuery的Ajax设置解决问题。

第四,通过定制化响应解决问题。

首先,问题再次出现。

我们在ASP.NET使用一个MVC应用程序来重现IE对Ajax请求结果的缓存。在一个空的ASP.NET MVC应用程序中,我们定义了以下默认的HomeController,它包括一个返回当前时间的Action方法GetCurrentTime。

公共类HomeController 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-.min . js ")'/script script type=' text/JavaScript ' $(function(){ window . setinterval(function(){ $)。ajax({ url'@Url。操作(' GetCurrentTime ')',成功函数(结果){ $('ul ')。追加(' li '结果'/Li ');} });}, );});/script/head body ul/ul/body/html用不同的浏览器运行这个程序会得到不同的输出结果。如下图所示,实时时间可以在Chrome浏览器中显示,但IE中显示的时间是一样的。

第二,通过给URL地址添加后缀来解决问题。

因为IE为Ajax请求返回的结果是根据请求的地址进行缓存的,如果我们不想让这种缓存机制生效,我们可以在每个请求时为请求的地址添加不同的后缀来解决这个问题。对于这个例子,我们通过下面的代码给请求地址添加一个基于当前时间的查询字符串,再次运行程序后,实时时间会显示在IE中。

!DOCTYPE html html头脚本类型=' text/JavaScript ' $(function(){ window . setinterval(function(){ $)。ajax({ url'@Url。操作(' GetCurrentTime ')?'新日期()。toTimeString(),成功函数(结果){ $('ul ')。追加(' li '结果'/Li ');} });}, );});/脚本/标题/html 3。通过jQuery的Ajax设置解决问题。

实际上,jQuery对此有Ajax设置,所以我们只需要调用$。ajaxSetup方法如下禁用Ajaz的缓存机制。

!DOCTYPE html html头脚本类型=' text/JavaScript ' $(function(){ $)。AJaxsetup({ cache false });window.setInterval(函数(){ $)。ajax({ url'@Url。操作(' GetCurrentTime ')',成功函数(结果){ $('ul ')。追加(' li '结果'/Li ');} });}, );});/script /head /html事实上,jQuery的这种机制是通过在请求地址中添加不同的查询字符串后缀来实现的,这可以通过Fiddler截获的请求来证明。

第四,通过定制化响应解决问题。

我们可以通过请求的响应来控制浏览器对结果的缓存。为此,我们定义了以下名为NoCacheAttribute的ActionFilter。在实现的OnActionExecuted方法中,我们调用当前HttpResponse的SetCacheability方法,将缓存选项设置为NoCache。在将NoCacheAttribute特性应用于GetCurrentTime方法之后,运行我们的程序仍然可以在IE中获得实时性。

公共类HomeController Controller {公共操作结果索引(){返回视图();} [NoCache]公共字符串getcurrentime(){ 0返回日期时间.现在。ToLongTimeString();} }公共类NoCacheAttribute筛选器属性,IActionFilter { public void onationexecuted(ActionExecutedContext筛选器上下文){筛选器上下文.HttpContext。回应。缓存。setcacheable(httpcacheable .NoCache);} action executing上的public void(action executing上下文筛选器上下文){ } }实际NoCacheAttribute特性最终控制消息消息的缓存控制报头,并将其设置为"无缓存",指示浏览器不要对结果进行缓存。如下所示的是针对GetCurrentTime请求的响应消息:

HTTP/.正常服务器ASP。网开发服务器/.日期:1月四日,格林尼治标准时间X-AspNet-版本.x-AspNetMvc-版本。缓存-控制无缓存杂注无缓存过期-内容-类型文本/html;字符集=utf-内容-长度连接关闭下午

更多资讯
游戏推荐
更多+