2014-10-09 61 views
0

我有一个包含AJAX轮询请求的页面,该请求每5秒触发一次,以及其他需要一分钟才能完成的AJAX CRUD操作。看起来发生的情况是轮询请求执行并每5秒完成一次,除非正在处理长时间运行的请求 - 在这些长时间运行的执行情况下,轮询请求的beforeSend事件将触发,但它不会触发控制器,直到长时间运行的请求已完成。轮询请求只是排队等待,直到长时间运行的请求完成,此时它将执行排队的轮询请求。对于长时间运行的请求,AJAX请求并不是完全异步处理的

我已经使用测试方法和30秒线程睡眠重新模拟了现有解决方案(下面的结果)中的场景,以模拟长时间运行的数据库事务。您会注意到,当TestSlowMethod30Seconds()开始时,TestRequest()呼叫开始排队,只有TestSlowMethod30Seconds()完成后,才会完成呼叫TestRequest()

如果我使用基本的MVC VS模板创建一个全新的解决方案,并按照预期工作,并且长时间运行的请求对其他请求没有影响 - 它们全部都是异步处理的。

我已经花了整整一天的时间进行这项测试,我无法为我的生活制定出现有解决方案中的问题。

有没有人有任何想法?

enter image description here

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"); 
} 

回答

2

会话状态。如果您的请求使用会话状态,则请求将被序列化。如果你不希望他们被序列化,那么你的服务器端代码将需要运行没有会话状态或被标记为只使用只读会话状态

+0

请求未使用会话状态。正如你在上面看到的,控制器方法非常简单。 – 2014-10-09 19:27:29

+0

如果这是asp。净,我相信他们会默认使用会话状态,即使你没有在控制器中使用它 – Mike 2014-10-09 19:34:26

+0

你真的在看!通过装饰控制器与[SessionState(SessionStateBehavior.ReadOnly)]使其工作。我想知道为什么然后我的新鲜的MVC测试应用程序工作,而不必设置会话状态的行为,但是当我通过在控制器中添加一些会话来测试导致相同的行为 – 2014-10-09 23:05:35

0

你可能会击中你的浏览器的并联连接数限制的最大数量:

Max parallel http connections in a browser?

您需要降低并发数t请求 - 只保留一个长池请求或切换到其他技术,如web-sockets或服务器端事件。

也有一个名为signalr

BTW一个有用的库:尝试打开多个标签页,你会发现更多的滞后

+0

我不明白这可能是问题。如果我将布局页面剥离到裸露的骨骼上,那只是两个试图执行的测试请求。 – 2014-10-09 19:26:15

+0

@MarkErasmus从你的日志中:你开始1个长请求然后6个测试请求(一个或两个(我不确定)测试请求将等待长请求完成)。 – 2014-10-09 19:34:52

+0

@MarkErasmus试着打开更多的6个长请求,你会注意到请求(7,8)将等待前面的完成 – 2014-10-09 19:38:09