【问题标题】:jquery-ajax request rejectedjquery-ajax 请求被拒绝
【发布时间】:2013-11-14 07:18:51
【问题描述】:

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

从 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 请求与之前正常的完全一样,被标记为取消/中止/拒绝。

【问题讨论】:

  • 请添加代码以显示问题。
  • 您正在向不同的主机发出 ajax 请求 - 具体如何?目标主机是否使用适当的 CORS 标头进行响应?
  • 帖子已更新。见上文。
  • 您在 Chrome 或 Firefox 控制台中是否遇到任何错误? XHR 请求应该与所有请求和响应标头一起显示在那里。
  • @HMR 在 Firefox 中似乎可以工作,但在 Internet Explorer 10 中却不行。在 Internet Explorer 中,我看不到任何已取消的信息,因为它们在处理之前已被取消。

标签: javascript ajax jquery


【解决方案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 等。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 2017-01-14
      • 1970-01-01
      • 2014-06-03
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多