繁体   English   中英

jquery-ajax请求被拒绝

[英]jquery-ajax request rejected

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

  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等。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM