0

我有一个 jquery-ajax,每次调用不同的 IP 多次。然后 jquery-ajax 在负责执行 ping 的 mvc4 控制器中调用一个动作,然后返回结果。

从 Internet Explorer 开发工具中,我注意到所有 ping 请求都被标记为待处理,并且它们被一一处理。一旦处理了一个 ping 请求,就会处理队列中的下一个请求,依此类推。发生的情况是最后一个 ping 请求突然被自动取消/中止/拒绝。每个 ping 请求包含 4 次重试,每次重试超时 5 秒。但是,如果我为每次重试设置较低的超时时间,例如,750 毫秒而不是 5 秒,那么一切都可以正常工作。所以我想知道为什么最后一个 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)
                }
        }
    }

看到 (...) 意味着更多的代码。此外,我需要返回 http 状态代码和 json 对象,以强制在“then”的成功或错误部分输入 jquery-ajax 调用。这段代码对于很多 ping 请求都可以正常工作,但如前所述,最后一个 ping 请求与之前正常的完全一样,被标记为取消/中止/拒绝。

4

2 回答 2

1
  1. 如果最后一个请求具有相同的发布数据,则可能存在一些浏览器缓存问题。为了安全起见,我会添加一个 cache-buster 参数。

  2. 您的 jquery ajax 调用可能会遇到超时情况。来自 jquery 文档

超时

类型:数字

为请求设置超时(以毫秒为单位)。这将覆盖使用 $.ajaxSetup() 设置的任何全局超时。超时时间从 $.ajax 调用开始;如果有几个其他请求正在进行并且浏览器没有可用的连接,则请求可能会在发送之前超时。

它们超时的原因是因为所有浏览器都会自动将多个请求排队到同一主机,以便在任何给定时间最多有 2 个并发请求。因此,如果您从 www.example.com 请求 3 个文件,则在前两个完成之前不会开始请求第 3 个文件。

您可以通过以下方式解决此问题:

  • 最好在先前请求完成时手动排队后​​续请求,而不是一次全部。我之所以这么说,是因为您对实际发生的事情保持最大的可见性,而不是浏览器或 jquery 对您隐藏它。
  • 更改给 jquery 的超时时间
  • 分片您的域。(即 shard1.example.com/Tests/Pin、shard2.example.com/Test/Ping 等。
于 2013-11-03T18:51:09.107 回答
1

您可以执行以下操作,而不是为每个 IP 地址发送单独的请求 -

  1. 在一次调用中将包含所有 IP 地址的 JSON 数组传递给 Web 服务。
  2. 修改您的 Web 服务,为每个 IP 创建一个线程并对其执行 ping 操作。
  3. 然后将包含 IP 及其统计信息的 JSON 数组发送回客户端。
  4. 在客户端解析数组以显示它们。
  5. 请记住使用thread.join让您的 webreference 主线程等待 ping 线程完成,否则 ping 线程将在完成任务之前终止。
于 2013-11-03T19:06:57.717 回答