jquery-ajax请求被拒绝

时间:2013-11-03 15:42:05

标签: javascript ajax jquery

我有一个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请求被标记为已取消/已中止/拒绝。

2 个答案:

答案 0 :(得分:1)

  1. 如果上次请求具有相同的发布数据,则可能会出现一些浏览器缓存问题。我想添加一个cache-buster参数是安全的。

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

  3.   

    超时

         

    类型:数字

         

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

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

    你可以通过以下方式解决这个问题:

    • 优选在先前的请求完成时手动排队后​​续请求,而不是一次排队。我说得非常好,因为你对实际发生的事情保持最大的可见性,而不是隐藏它的浏览器或jquery。
    • 更改给予jquery的超时
    • 分割您的域名。 (即shard1.example.com/Tests/Pin,shard2.example.com/Test/Ping等。

答案 1 :(得分:1)

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

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