IHttpHandler,IHttpAsynHandlerIHttp奇怪的阻塞现象

IHttpHandler,IHttpAsynHandler这两个接口是.net提供的同步与异步处理程序的接口,可以和Ajax很好的结合。

最近在做一个Comet的实现,就是实现实时server push,服务器端实现了IHttpAsynHandler的入口A,而应用的页面上出了这个Ajax外,还会有一个Ajax调用IHttpHandler的ashx,称之为B。结果问题出现了,A是保持长连接的,20秒返回一次数据,而B是页面按钮触发,当B ajax post时,会发现无法进入服务器代码,一直等待中,直到A返回。

这个问题的原因在于阻塞,但不是Ajax的阻塞,而是Session锁住了。IHttpHandler,IHttpAsynHandler这两个接口的实现是没有Session,除非实现 IRequiressessionstate接口,问题就出现在这个接口上,当IHttpHandler,IHttpAsynHandler执行过程未返回是,Session读写是被锁住的,就是说,其他使用Session的方法都必须等待。上面的例子,由于应用的需要,A、B其实都实现了IRequiressessionstate,A是长连接,所以大部分时间Session被A锁住了,而B就必须等到A的断开释放。问题清晰了,解决的方法也很容易找到:1、避免使用Session;2、IRequiressessionstate是读写锁,IReadOnlySessionState只是读锁,而读锁是可以并发的,所以使用IReadOnlySessionState更佳;3、如果一定需要IRequiressessionstate,那么请速度完成执行,尽早退出异步操作。

这种情况在很多应用中是经常发生的,比如我之前做过夜个页面,页面加载后会有两个Ajax请求两个表格的数据,但结果就是第一个表格加载完后第二个表格的数据才能加载,简直就是性能杀手,那时找了很久都没结果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章