我有一个长时间运行的服务调用,我使用 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/