javascript - 长时间运行的 AJAX 请求在几分钟后重新提交

标签 javascript jquery ajax

我有一个长时间运行的服务调用,我使用 jQuery.ajax 调用它。该服务可能需要 2 分钟以上才能完成。

AJAX 请求已提交,预计不会有任何响应。一个单独的 AJAX 请求报告操作的进度。

在一些网站上,我们发现 2 分钟后代理重新提交 Ajax 请求本身。浏览器是 Chrome,但我怀疑它是 Chrome 相关的问题。

这绝对不是我们重新提交ajax请求的情况。为了确保我们设置了一个 bool 来防止在 beforeSend 事件中重新提交。

我现在处理这种重新提交的方式是向数据请求添加随机数,并且服务测试在执行操作之前是否已经提交了随机数。对该服务的任何第二次调用都会无害地返回,并且原始请求会继续进行。

请注意,我添加了一个无意义的服务,它除了等待 5 分钟外什么都不做,而且我从未遇到过测试服务的问题(在生产站点上)。

任何人都可以给我任何线索,说明导致此 ajax 重新提交的原因,以及如何在本地复制它吗?

这是用来发送请求的js:

var sent = false;
var data = { ... }; // data is a very large object;

$.ajax("service.ashx?loc=area/subarea/", {
    type: "POST",
    data: data,
    traditional: true,
    error: function (jqXHR, textStatus, errorThrown) {
        if (jqXHR.status === 0) {
            // see http://stackoverflow.com/questions/3825581/does-an-http-status-code-of-0-have-any-meaning

        } else {
            ReportFailure(textStatus,errorThrown);
        }
    },
    beforeSend: function () {
        if (sent === true) {
            return false;
        }
        sent = true;
        return true;
    }
});

这是从 HTTP 存档 (HAR) 请求的 ajax,请求重新提交后立即失败。注意 2 分钟时间。

{
"startedDateTime": "2015-12-11T12:26:58.018Z",
"time": 120066.61499999973,
"request": {
  "method": "POST",
  "url": "https://example.com/service.ashx?loc=area/subarea/",
  "httpVersion": "HTTP/1.1",
  "headers": [
    ... // removed for brevity
  ],
  "queryString": [
    { "name": "loc", "value": "area/subarea/" }
  ],
  "cookies": [
    ... // removed for brevity
  ],
  "headersSize": 1163,
  "bodySize": 48048,
  "postData": {
    "mimeType": "application/x-www-form-urlencoded; charset=UTF-8",
    "text": ..., // removed for brevity
    "params": [
      ... // removed for brevity        ] }
},
"response": {
  "status": 500,
  "statusText": "Internal Server Error",
  "httpVersion": "HTTP/1.1",
  "headers": [
    {
      "name": "Date",
      "value": "Fri, 11 Dec 2015 12:28:57 GMT"
    },
    ... // removed for brevity
  ],
  "cookies": [],
  "content": {
  "size": 54,
  "mimeType": "text/xml",
  "compression": 0
  },
  "redirectURL": "",
  "headersSize": 305,
  "bodySize": 54,
  "_transferSize": 359
},
"cache": {},
"timings": {
  "blocked": 120005.055999998,
  "dns": -1,
  "connect": -1,
  "send": 1.0939999989932403,
  "wait": 59.986000001008506,
  "receive": 0.47900000172376167,
  "ssl": -1
},
"connection": "7498"

最佳答案

同样的故事。如果到目前为止客户端没有收到响应,jQuery 显然会在 120 秒(默认超时)后重新发送请求。

增加超时时间:

    $.ajax({
      url: localhost,
      type: 'POST',
      timeout: 1000*60*10

不会改变游戏规则。 2 分钟后请求仍然重新发送,尽管客户端继续等待任何响应。

虽然服务器端能够很好地并行处理这两个请求,但客户端请求在第一个请求的有效响应时失败。

还没有解决

编辑:

事实证明,浏览器是重新发送事件的浏览器,并且该行为完全符合 HTTP/1.1 规范。实际上,(node.js)后端在 120 秒超时后关闭了套接字,如 jonasnas 所指。解决方案是在响应对象中禁用超时,如:

    // this is a long running request,
    // so disable response timeout
    response.setTimeout(0);

关于javascript - 长时间运行的 AJAX 请求在几分钟后重新提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265832/

相关文章:

javascript - Mongoose 获取字段总和

javascript - Ember-data 无法读取未定义的属性 'length'

php - jQuery、AJAX 表单处理 - 单选按钮值问题,

ajax - 通过 AJAX 设置时不保留 iOS 6 Mobile Safari session 变量

javascript - 如何找到导致非自愿路由的代码段? (在旧网站中)

javascript - 由于 iOS 12.4 iframe 无法更改顶部 url

php - 当链接注入(inject) <tbody> 时, Bootstrap 确认模式不起作用

javascript - jQuery 和 Google URL Shortener API

jquery - 405(不允许方法)laravel 5 for ajax

javascript - $stateParams,如何将值从一种状态传递到另一种状态