我有一个页面,其中包含每5秒触发一次的AJAX轮询请求以及可能需要一分钟才能完成的其他AJAX CRUD操作。似乎正在发生的事情是轮询请求每隔5秒执行并完成一次,除非正在处理长时间运行的请求 - 在这些长时间运行的执行方案中,轮询请求的beforeSend
事件将触发,但它不会点击控制器直到长时间运行请求完成。轮询请求只是排队并等待长时间运行的请求完成,此时它将执行排队的轮询请求。
我已经使用测试方法和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");
}
答案 0 :(得分:2)
会话状态。如果您的请求使用会话状态,则请求将被序列化。如果您不希望它们被序列化,那么您的服务器端代码将需要在没有会话状态的情况下运行或仅被标记为仅使用只读会话状态
答案 1 :(得分:0)
您可能达到了浏览器的最大并行连接数限制:
Max parallel http connections in a browser?
您需要减少并发请求的数量 - 只保留一个长池请求或切换到其他技术,如Web套接字或服务器端事件。
还有一个名为signalr
的有用库BTW:尝试打开更多标签,你会发现更多的滞后