【发布时间】:2016-03-19 20:42:31
【问题描述】:
我有一个长时间运行的服务调用,我使用 jQuery.ajax 进行调用。该服务可能需要 2 分钟以上才能完成。
AJAX 请求已提交,但预计没有响应。一个单独的 AJAX 请求报告操作的进度。
在某些站点上,我们发现代理会在 2 分钟后自行重新提交 Ajax 请求。浏览器是 Chrome,但我怀疑它与 Chrome 相关。
这绝对不是我们重新提交ajax请求的情况。为了确保我们设置了一个布尔值来防止在 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"
【问题讨论】:
-
您是否检查过在重新提交时您的代码(ajax 代码)是否实际被调用...您可以在 ajax 请求之前和
beforeSend处理程序中添加一个console.log()stmt检查这一点 - 如果您的代码确实发送了第二个请求,那么消息将在控制台中记录两次 -
下一步可以在 ajax 行中放置一个断点以查看它是否被调用两次,以及是否查看堆栈跟踪以查看第二次调用的启动方式/位置...或者您可以使用
console.trace()日志记录查看调用堆栈 -
我确定不是我的 ajax 请求在代码中重新提交。一方面,重新提交不会在 Chrome 网络分析器中显示为单独的请求 - 如果只是重新执行代码,就会出现这种情况。 beforeSend 没有第二次执行。
-
是的......你是对的......在这种情况下,我认为不是客户端代码导致它......你将不得不重新查看你的服务器端代码。 ..
-
我不确定服务器会出现什么问题。即使用户代理重新提交了请求,原始请求也会继续执行。我试图指出为什么重新提交请求。
标签: javascript jquery ajax