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請求兩個表格的數據,但結果就是第一個表格加載完後第二個表格的數據才能加載,簡直就是性能殺手,那時找了很久都沒結果。

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