我有一个包含AJAX轮询请求的页面,该请求每5秒触发一次,以及其他需要一分钟才能完成的AJAX CRUD操作。看起来发生的情况是轮询请求执行并每5秒完成一次,除非正在处理长时间运行的请求 - 在这些长时间运行的执行情况下,轮询请求的beforeSend事件将触发,但它不会触发控制器,直到长时间运行的请求已完成。轮询请求只是排队等待,直到长时间运行的请求完成,此时它将执行排队的轮询请求。对于长时间运行的请求,AJAX请求并不是完全异步处理的
我已经使用测试方法和30秒线程睡眠重新模拟了现有解决方案(下面的结果)中的场景,以模拟长时间运行的数据库事务。您会注意到,当TestSlowMethod30Seconds()开始时,TestRequest()呼叫开始排队,只有TestSlowMethod30Seconds()完成后,才会完成呼叫TestRequest()。
如果我使用基本的MVC VS模板创建一个全新的解决方案,并按照预期工作,并且长时间运行的请求对其他请求没有影响 - 它们全部都是异步处理的。
我已经花了整整一天的时间进行这项测试,我无法为我的生活制定出现有解决方案中的问题。
有没有人有任何想法?
var ajaxTest = namespace("test.ajaxTest");
ajaxTest.init = function() {
window.setInterval(function() {
ajaxTest.TestRequest();
}, 5000);
};
ajaxTest.TestRequest = function() {
$.ajax({
type: "POST",
url: "/Test/TestRequest",
beforeSend: function() {
console.log("*** TestRequest() begin");
},
complete: function() {
console.log("*** TestRequest() complete");
}
});
};
// this method is called from a button click event
ajaxTest.TestSlowMethod30Seconds = function() {
$.ajax({
type: "POST",
url: "/Test/TestSlowMethod30Seconds",
beforeSend: function() {
console.log("*** TestSlowMethod30Seconds() begin");
},
complete: function() {
console.log("*** TestSlowMethod30Seconds() complete");
}
});
};
MVC测试控制器
public ActionResult TestRequest()
{
return Json("Success");
}
public ActionResult TestSlowMethod30Seconds()
{
System.Threading.Thread.Sleep(30000);
return Json("Success");
}