1

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

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

我获得 JSONP 的方式是使用我前段时间从 SO (http://stackoverflow.com/questions/2499567/how-to-make-a-json-call-to-一个网址)

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'),然后将其分配为窗口对象内的一个函数,然后将其用作注入到文档中的动态 javascript 的 url 的“回调”参数,然后是“ud”函数运行,删除脚本并使用接收到的数据调用“成功”回调函数。

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

就好像响应对它来说“太快了”。

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

有谁知道我怎样才能让它与缓存的响应一起工作......?

4

1 回答 1

0

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

于 2012-04-15T14:50:28.733 回答