2009-06-05 103 views
4

我们使用具有JsonP机制的动态脚本标记来实现跨域Ajax调用。前端小部件非常简单。它只是调用搜索Web服务,传递用户提供的搜索条件并接收并动态呈现结果。如何防止IE缓存导致重复的Ajax请求?

注意 - 对于那些不熟悉的动态脚本标签与执行类似Ajax的请求到服务的JSONP方法返回JSON格式的数据,我可以解释如何利用它,如果你认为它可能与问题有关。

该服务是WCF托管在IIS上。这是Restful,所以当用户点击搜索时我们做的第一件事就是生成一个包含条件的Url。它看起来像这样...

https://.../service.svc?criteria=john+smith

然后,我们使用动态创建的HTML脚本代码设置到上述网址的来源属性,使要求我们的服务。结果返回,我们处理它以显示结果。

这一切工作正常,但我们注意到,当使用IE服务收到来自客户端的请求两次。我用小提琴手来监视流量离开浏览器果然我看到两个请求与以下网址...

第二个请求已附加了某种Id。每个请求的Id都不相同。

我的直接想法是它与缓存有关。在网址末尾添加随机数是禁用浏览器缓存的经典方法之一。为了证明这一点,我调整了IE中的缓存设置。

  • 我将“检查更新版本的存储页面”设置为“从不” - 这导致每次只产生一个请求。结尾有随机数的那个。

  • 我将此设置值重新设置为默认值“自动”,并且请求立即开始再次发送两次。

有趣的是,我没有收到客户的两个请求。我发现这reference有人建议这可能是一个与IE浏览器的错误。 Firefox上这种情况不会发生,这一事实支持这一理论。

  1. 任何人都可以确认这是否与IE浏览器的错误?这可能是设计。
  2. 有谁知道我可以阻止它发生的一种方式吗?

我的用户运行的一些比较模糊的搜索占用了足够的处理资源,使任何一个非常糟糕的想法翻倍。我真的想避免这种情况,如果在所有可能:-)

回答

2

我最终确定了重复请求的原因。正如我所说,我选择用于进行Ajax调用的机制是使用动态脚本标记。我建立请求的URL,创造了一个新的脚本元素和分配的URL src属性...

var script = document.createElement(“script”); 
script.src = https://....”; 

然后通过其追加到文件头部执行脚本。重要的是,我是使用jQuery附加功能......

$(“head”).append(script); 

里面的附加功能:jQuery是期待,我试图让Ajax调用。如果要附加的元素类型是脚本,则它执行一个特殊的例程,该例程使用XmlHttpRequest对象发出Ajax请求。但脚本仍然被追加到文档头上,并由浏览器在那里执行。因此,双重要求。

  1. 第一个直接来自剧本 - 我打算发生的一个。
  2. 第二个来自JQuery附加函数。这是后缀为“& _ = 123456789”形式的随机生成的查询字符串参数的请求。

我通过防止JQuery库的副作用来简化事情。我使用本机追加功能...

document.getElementByTagName(“head”).appendChild(script); 

现在发生一个请求以我想要的方式发生。我不知道JQuery append函数可能会产生如此明显的副作用。

3

我刚写了一篇文章如何avoid caching of ajax requests :-)

它基本上包括添加没有缓存头随附在

任何Ajax请求
public abstract class MyWebApplication : HttpApplication 
{ 
    protected MyWebApplication() 
    { 
     this.BeginRequest += new EventHandler(MyWebApplication_BeginRequest); 
    } 

    void MyWebApplication_BeginRequest(object sender, EventArgs e) 
    { 
     string requestedWith = this.Request.Headers["x-requested-with"]; 
     if (!string.IsNullOrEmpty(requestedWith) && requestedWith.Equals(”XMLHttpRequest”, StringComparison.InvariantCultureIgnoreCase)) 
     { 
      this.Response.Expires = 0; 
      this.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1); 
      this.Response.AddHeader(”pragma”, “no-cache”); 
      this.Response.AddHeader(”cache-control”, “private”); 
      this.Response.CacheControl = “no-cache”; 
     } 
    } 
} 
+0

对于我来说,看起来像是一个非常好的开始。如果事实证明有帮助,我会尽快接受。感谢您及时的回复! – 2009-06-05 15:16:50

0

请参阅www.enhanceie.com/redir/?id=httpperf进一步讨论。