首页 新闻 会员 周边

服务器处理请求问题(100分)

0
悬赏园豆:100 [已解决问题] 解决于 2009-07-25 15:18

场景描述: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住一个请求,然后循环处理,但是却发现其它的请求都要等到这个请求处理完才会执行,哪位给解决一下,谢谢.

问题补充: 回斯克迪亚:1,我用的是ext的异步请求,也就是说,各请求之间是没有什么关联的。 2,B确实没有执行,如果A.aspx去掉while(true)然后再把Thread.Sleep(5000)改为5秒的话,那么5秒后B就会执行。 3,如果新建一个线程的话,然后以新建的线程里while(true)循环,我本来也以为这样子可以,但是一请求就返回了,也就是说请求的主线程结束,请求也就结束了,所以你新建的线程完全没用. 回eaglet:1,分别打开A和B可以同时执行,但如果先打Main,再按Main里的A按钮,再打开B,B就一直等待了 2,将iis的keep-Alive改为off了,还是不行,跟原来一样的情况 呵呵,改用webservice的方式就可以了
chanball的主页 chanball | 初学一级 | 园豆:105
提问于:2009-07-21 18:39
< >
分享
最佳答案
0

这个问题我分析是由于 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

eaglet | 专家六级 |园豆:17139 | 2009-07-22 08:09
其他回答(1)
0

关注一下,对于这个问题我也不解,按道理来说Asp.net应该是多线程的,而Sleep也不会导致CPU被占满而无法处理其他线程。

但不知是不是你的Main.aspx页中没协调好两次访问而产生了此问题,比如可能异步请求A后,A一直循环而不响应请求,那么此次请求就会处于长时间等待中,而这时B的请求又被设计为在A响应后再发送。

建议重写一下B页面的OnInit事件,在里面随便打点代码,设个断点,监测一下B请求时是否执行到这里,或者自己实现一个httpmodule,做更早期更准确的监测。

对于你要实现的功能,应该可以让A请求后,页面新建线程来执行长时间操作,以此来实现。

斯克迪亚 | 园豆:4124 (老鸟四级) | 2009-07-21 19:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册