JSONP从WCF服务获取缓存响应的问题

时间:2012-04-05 11:22:57

标签: javascript jquery wcf caching jsonp

我在客户端使用JSONP使用WCF服务从服务器获取数据,该服务可以使用HTTP GET返回结果(它获得'callback'参数,这是'函数名'并返回回调({data}),你知道...... JSONP)。

一切正常,但是如果我在其中一个服务的操作上启用缓存(使用'AspNetCacheProfile') - 那么出了点问题,我不确定是什么......

我获得JSONP的方法是使用我之前从问题中获取的函数(http://stackoverflow.com/questions/2499567/how-to-make-a-json-call -to-A-URL)

function getJSONP(url, success) {
  var ud = 'fc_' + + Math.floor(Math.random()*1000000),
      script = document.createElement('script'),
      head = document.getElementsByTagName('head')[0]
          || document.documentElement;

  window[ud] = function(data) {
      head.removeChild(script);
      success && success(data);
  };

  script.src = url.replace('callback=?', 'callback=' + ud);
  head.appendChild(script);
}

这会创建一个随机id('fc_xxxx')然后将其作为一个函数分配给window对象,然后将其用作注入文档的动态javascript的url的'callback'参数,然后'ud'函数运行,删除脚本并使用接收的数据调用'success'回调函数。

在服务的正常非缓存操作中使用它时,通常需要大约200ms才能获得响应,并且它可以正常工作。
缓存的响应大约需要10毫秒 - 并且我收到'fc_XXXXX'函数未定义的错误。

就好像响应“太快”了。

我也尝试过使用 jQuery.getJSON() - 而且回调也不会触发。
在所有情况下,当我查看Firebug中的网络流量时 - 我可以看到GET请求,我可以看到正确的数据实际上已经返回

有没有人知道我如何才能使缓存的响应正常工作......?

1 个答案:

答案 0 :(得分:0)

我明白了!响应函数的名称在每次调用时都是不同的(在我的手动jsonp实现和jQuery的实现上)。
该函数的名称是服务器响应的一部分(因为这是jsonp如何工作的一部分......)。 因此,如果响应是缓存响应 - 它实际上将返回函数的旧名称(在客户端的上下文中将不再存在)。
所以我只需要在这种情况下给回调函数一个常量名称,它应该没问题。 :)