我有一个 jquery-ajax,每次使用不同的 IP 调用多次。然后 jquery-ajax 调用 mvc4 Controller 中负责执行 ping 的操作,然后返回结果。
从 Internet Explorer 开发工具中,我注意到所有 ping 请求都被标记为待处理,并且它们会被一一处理。一旦一个 ping 请求得到处理,队列中的下一个请求就会得到处理,依此类推。发生的情况是最后一次 ping 请求突然被自动取消/中止/拒绝。每个 ping 请求包含 4 次重试,每次重试的超时时间为 5 秒。但是,如果我为每次重试设置较低的超时时间,例如 750 毫秒而不是 5 秒,那么一切都会正常工作。所以我想知道为什么最后的 ping 请求会被自动取消...最后的 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"
});
Controller 中的操作:
[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 请求与之前的操作完全一样,但被标记为已取消/中止/拒绝。
最佳答案
如果最后一个请求具有相同的发布数据,则可能存在一些浏览器缓存问题。为了安全起见,我会添加一个缓存破坏程序参数。
您的 jquery ajax 调用可能会遇到超时情况。来自 jquery 文档
timeout
Type: Number
Set a timeout (in milliseconds) for the request. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent.
它们超时的原因是因为所有浏览器都会自动将多个请求排队到同一主机,以便在任何给定时间最多有 2 个并发请求。因此,如果您从 www.example.com 请求 3 个文件,则在前两个文件完成之前,不会开始请求第三个文件。
您可以通过以下方式解决此问题:
- 最好在先前的请求完成后手动对后续请求进行排队,而不是一次性全部完成。我说“最好”是因为您对实际发生的情况保留了最大的可见性,而不是浏览器或 jquery 将其隐藏起来。
- 更改 jquery 的超时
- 对您的域进行分片。 (即 shard1.example.com/Tests/Pin、shard2.example.com/Test/Ping 等。
关于javascript - jquery-ajax 请求被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19754730/