我有一个包含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");
}
请求未使用会话状态。正如你在上面看到的,控制器方法非常简单。 – 2014-10-09 19:27:29
如果这是asp。净,我相信他们会默认使用会话状态,即使你没有在控制器中使用它 – Mike 2014-10-09 19:34:26
你真的在看!通过装饰控制器与[SessionState(SessionStateBehavior.ReadOnly)]使其工作。我想知道为什么然后我的新鲜的MVC测试应用程序工作,而不必设置会话状态的行为,但是当我通过在控制器中添加一些会话来测试导致相同的行为 – 2014-10-09 23:05:35