场景描述:Main.aspx有A与B两个按钮,单击两按钮时分别异步请求A.aspx和B.aspx,两页面的代码是分别如下:
Code
Code
然后我点击A按钮请求A.aspx页面,A.aspx不断的执行循环,再点击B按钮,发现B.aspx永远不会执行,也就是说B.aspx要等到A.aspx执行完才执行,按道理应该是服务器为每一个到来的请求从线程池里取出一个线程处理当前请求,在这种多线程的情况下,B.aspx应该不用等待A.aspx执行完才执行的。
我用jsp在tomcat服务器试过,完全没问题。在asp.net下就不行了。
因为要做一个长连接的功能,需求在后台catch住一个请求,然后循环处理,但是却发现其它的请求都要等到这个请求处理完才会执行,哪位给解决一下,谢谢.
这个问题我分析是由于 http keep-alive 造成的。你在同一个连接中连续发出两个http 请求,即便是异步的,但底层却使用同一个tcp 连接,第一个请求没处理完,第二个请求不可能被接受。
你可以试试开两个浏览器窗口,一个点A,一个点B,看能不能同时执行。
要解决这个问题,需要在IIS 中将keep-alive 设置为off
见下面链接:
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/d7e13ea5-4350-497e-ba34-b25c0e9efd68.mspx?mfr=true
关注一下,对于这个问题我也不解,按道理来说Asp.net应该是多线程的,而Sleep也不会导致CPU被占满而无法处理其他线程。
但不知是不是你的Main.aspx页中没协调好两次访问而产生了此问题,比如可能异步请求A后,A一直循环而不响应请求,那么此次请求就会处于长时间等待中,而这时B的请求又被设计为在A响应后再发送。
建议重写一下B页面的OnInit事件,在里面随便打点代码,设个断点,监测一下B请求时是否执行到这里,或者自己实现一个httpmodule,做更早期更准确的监测。
对于你要实现的功能,应该可以让A请求后,页面新建线程来执行长时间操作,以此来实现。