0

毎回異なるIPで数回呼び出されるjquery-ajaxがあります。次に、jquery-ajax は、ping の実行を担当する mvc4 コントローラーでアクションを呼び出し、結果を返します。

Internet Explorer 開発ツールから、すべての ping 要求が保留中としてマークされ、1 つずつ処理されることに気付きました。1 つの ping 要求が処理されると、キュー内の次の要求が処理されます。何が起こるかというと、最後の ping 要求が突然自動的にキャンセル/中止/拒否されます。各 ping 要求は 4 回の再試行で構成され、各再試行は 5 秒のタイムアウトで行われます。ただし、再試行ごとに短いタイムアウトを設定すると、たとえば、5 秒ではなく 750 ミリ秒に設定すると、すべてが完全に機能します。最後の ping リクエストが自動的にキャンセルされる理由を知りたいのですが... 最後の ping リクエストは、サービスが提供されるまでに「長い」時間がかかるため、拒否されているようです。

必要に応じて、ここにコードを投稿できます。お知らせください。

私はjquery-1.10.2を使用しています

更新しました:

ajax({
    url: "/Tests/Ping/",
    data: { IPAddress: IP },
    type: 'POST',
    dataType: 'json'
}).then(function (data) {
        // Do some stuff on success
   },
   function (data) {
        // Do some stuff on error
        // here I am receiving for last ping requests:
        // readyState: 0
        // responseText: ""
        // status: 0
        // statusText: "error"           
   });

コントローラーでのアクション:

    [HttpPost]
    public ActionResult Ping(string IPAddress)
    {
       (...)
       System.Net.NetworkInformation.Ping pinger = new System.Net.NetworkInformation.Ping();
       (...)
        string data = new String('a', 32);
        byte[] buffer = Encoding.ASCII.GetBytes(data);

        int timeout = 5000;
        for (int i = 0; i < 4; i++)
        {
            reply = pinger.Send(IPAddress, timeout, buffer);
            (...)
        }

        (...)
        Response.ContentType = "application/json;charset=utf-8";
        Response.StatusCode = (int)(packetsLost < 4 ? HttpStatusCode.OK : HttpStatusCode.NotFound);

        return new JsonResult()
        {
                Data = new
                {
                    sent = 4,
                    received = 4- packetsLost,
                    lost = packetsLost,
                    percentLost = (int)(packetsLost / 4* 100)
                }
        }
    }

(...) はより多くのコードを意味することを確認してください。また、「then」の成功またはエラー セクションに jquery-ajax 呼び出しを強制的に入力するために、http ステータス コードと json オブジェクトを返す必要があります。このコードは、多くの ping 要求に対して正常に機能していますが、前述のように、前回とまったく同じように正常に実行された最後の ping 要求は、キャンセル/中止/拒否としてマークされます。

4

2 に答える 2

1

IPアドレスごとに個別のリクエストを送信する代わりに、次のことができます-

  1. すべての IP アドレスを含む JSON 配列を 1 回の呼び出しで Web サービスに渡します。
  2. Web サービスを変更して、IP ごとにスレッドを作成し、ping を実行します。
  3. 次に、IP とその統計を含む JSON 配列をクライアントに送信します。
  4. クライアント側で配列を解析して表示します。
  5. thread.joinping スレッドが完了するまで webreference のメイン スレッドを待機させるために使用することを忘れないでください。そうしないと、タスクを完了する前に ping スレッドが終了してしまいます。
于 2013-11-03T19:06:57.717 に答える