4

ajax呼び出しを使用して、.netサーバーでロングポーリングを使用するように設定されたJavaScript Webアプリがあります。

var _listenTimeout = 5 * 60 * 1000;
//...
$.ajax({
      type: "GET",
      url: url,
      async: true,
      cache: false,
      dataType: "jsonp",
      timeout: _listenTimeout,
      success: callback
});

ただし、ページがしばらく開いていると、サーバーへの要求が応答しなくなるという問題があります。パケットが Web ブラウザーとネットワークからサーバーに送信される間で滞留している状態にあるようです。

私は掘り下げて、いくつかのことを知っています:

  • リクエストは、chrome Web 開発者ネットワーク タブ (chrome://net-internals も) と firebug に表示されるため、送信されます。リクエストのステータスは常に保留中であり、その状態で停止するだけです。
  • curl同じ URL を送信するとすぐに応答が返されるため、要求 URL は正しいです。
  • Wiresharkを使用して検出されたパケットがないため、ネットワークを離れていません。サーバーログ(およびその側のwireshark)にも何も表示されません。

奇妙なことに、散発的に動作することもありますが、数分の遅延があります。つまり、ブラウザーのネットワーク ログは、要求が応答を受け取ったことを検出し (私の場合は 204)、wireshark は要求が送信されたことを検出します (そして、サーバーエンド)。遅延はブラウザと Wireshark の両方で同じです。つまり、リクエストが行われ、遅延が発生し、chrome が応答を検出し、wireshare が送信されたパケットを検出します。

ページのクリーン リフレッシュでも問題が修正され、同じ要求/応答がほぼ即座に発生します (関連するブラウザー ネットワークと Wireshark ログを使用)。

Chrome 21.0.1180.89 と Firefox 14.01 で試しました。

ブラウザで ajax リクエストが詰まるような、ある種のブラウザ キューはありますか? それとも、同時リクエストが多すぎるのでしょうか? 今のところわかりません...

4

1 に答える 1

0

$.ajax は定期的なリクエストを行いません。timeout オプションは、ポーリング以外の実際のリクエストを行う際の遅延を指定します。ここでそれについて読んでください。http://api.jquery.com/jQuery.ajax/。そのため、ajax リクエストが 1 つしか表示されていません。手動で必要な場合は、setTimeout javascript メソッドを使用して行う必要があります。

成功コールバックとエラー コールバックで setTimeout を呼び出すと、同時の ajax リクエストを取り除くことができます。

于 2012-09-21T20:28:18.387 に答える