1

クライアントでJSONPを使用して、HTTP GETを使用して結果を返すことができるWCFサービスを使用してサーバーからデータを取得します(「関数名」である「callback」パラメーターを取得し、callback({data})を返します)。 .. JSONP)。

すべてが機能しますが、サービスの操作の1つで(「AspNetCacheProfile」を使用して)キャッシュを有効にすると、何かがおかしくなり、何がわかりません...

JSONPを取得する方法は、SO(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')が作成され、ウィンドウオブジェクト内の関数として割り当てられ、ドキュメントに挿入される動的JavaScriptのURLの'callback'パラメーターとして使用され、次に' ud'関数が実行され、スクリプトが削除され、受信したデータを使用して「success」コールバック関数が呼び出されます。

サービスからの通常のキャッシュされていない操作で使用する場合、通常、応答を返すのに約200ミリ秒かかり、問題なく動作します。
キャッシュされた応答には約10ミリ秒かかります。「fc_XXXXX」関数が定義されていないというエラーが表示されます。

まるで応答が「速すぎる」かのようです。

また、 jQuery.getJSON()を使用してみましたが、コールバックがトリガーされません。
すべての場合において、Firebugのネットワークトラフィックを見ると、GETリクエストが表示され、正しいデータが実際に返されることがわかります

キャッシュされた応答で正しく機能させる方法を誰かが知っていますか...?

4

1 に答える 1

0

わかった!応答関数の名前は、呼び出しごとに異なります(手動のjsonp実装とjQueryの実装の両方で)。
関数の名前はサーバーからの応答の一部です(これはjsonpの動作の一部です...)。したがって、応答がキャッシュされた応答である場合、実際には関数の古い名前が返されます(これはクライアントのコンテキストには存在しなくなります)。
したがって、この場合、コールバック関数に定数名を付ける必要があります。これで問題ありません。:)

于 2012-04-15T14:50:28.733 に答える