首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jquery-ajax请求被拒绝

jquery-ajax请求被拒绝
EN

Stack Overflow用户
提问于 2013-11-03 15:42:05
回答 2查看 1.5K关注 0票数 0

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

在开发工具中,我注意到所有ping请求都被标记为挂起,并且一个接一个地提供服务。一旦服务了一个ping请求,队列中的下一个请求就会被服务,依此类推。最后的ping请求突然被自动取消/中止/拒绝。每个ping请求包括4次重试和每次重试,超时时间为5秒。但是,如果我为每一次重试设置一个较低的超时时间,例如,750毫秒而不是5秒,那么所有这些都能完美地工作。所以我想知道为什么最后的ping请求会自动取消.似乎最后一项被拒绝是因为它们需要“很长”的时间才能得到服务。

我可以在这里张贴一些代码,如果需要,请,让我知道。

我正在使用jquery-1.10.2

更新:

代码语言:javascript
复制
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"           
   });

在主计长中的行动:

代码语言:javascript
复制
    [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对象,以便强制jquery调用在“然后”中的“成功或错误”部分中输入。这段代码对很多ping请求都是正常的,但是正如前面所说的,最后的ping请求与以前的相同,都被标记为已取消/中止/拒绝。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-03 18:51:09

  1. 如果最后一个请求具有相同的post数据,则可能会出现一些浏览器缓存问题。为了安全起见,我会添加一个缓存破坏程序参数。
  2. 您的jquery调用可能会遇到超时场景。来自jquery文档

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

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

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

  • 当先前的请求完成时,最好是手动排列后续请求,而不是一次全部排队。我之所以这么说,是因为您保留了对实际发生的事情的最清楚的了解,而不是浏览器或jquery对您隐藏它。
  • 更改给jquery的超时
  • 分享你的域名。(即)etc /Test/Pin,shard2.example.com/Test/Ping等。
票数 1
EN

Stack Overflow用户

发布于 2013-11-03 19:06:57

与其为每个IP地址发送单独的请求,您还可以执行以下操作-

  1. 在一次调用中将包含所有IP地址的JSON数组传递给one服务。
  2. 修改您的web服务,为每个IP创建一个线程,并对其进行ping。
  3. 然后将包含IP及其状态的JSON数组发送回客户端。
  4. 在客户端解析数组以显示它们。
  5. 请记住使用thread.join使我们的主线程等待ping线程完成,否则ping线程将在它们完成任务之前终止。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19754730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档