asp.net Session造成請求阻塞現象

iDotNetSpace發表於2010-01-07

現象:在一個網站中,當訪問一個處理比較耗時的頁面(A頁面),頁面請求還沒有返回時,此時再點選訪問該網站的其他頁面(B頁面)會出現B頁面很久都沒有響應和返回,直到A頁面輸出返回資料時才開始處理B頁面的請求,造成請求排隊處理,A頁面阻塞了B頁面的請求處理。

 

開始我一直懷疑是不是瀏覽器單執行緒的緣故,在網上搜尋了資料,IE6/7,FF都是多執行緒瀏覽器(IE6好像是2個執行緒),用IE6、IE7、FF都試過了,結果一樣,這就奇怪了,明明都是多執行緒,怎麼會阻塞呢?

 

在網上搜尋了好幾次相關的問題,還是沒查出個所以然,但網站造成的客戶體驗確實很差,每當訪問到那個耗時的A頁面時,再想訪問其他頁面根本檢視不了。“怎麼系統那麼慢”,暈,沒辦法,我也不懂怎麼處理(不負責任的態度啊,呵呵)。

 

在一次的無意中我發現竟然在A頁面Loading(頁面上加的提示)的時候,可以訪問某個頁面,真是驚喜,再試試幾次,可以,確實可以,是不是頁面程式碼阻塞了?於是查這兩個頁面的程式碼,其實這兩個頁面的程式碼就十幾行,沒什麼問題呢。

 

經過多次嘗試和比對,才發現這兩個頁都是無需登陸驗證的頁面,之前出現阻塞的頁面都是需登陸驗證後才可訪問的頁面,而系統的驗證資訊是儲存在 Session中,通過Session判斷驗證的。這時想到應該是Session的問題,但還是不知如何處理,再去網上搜尋,網際網路上的資訊真是應有盡 有,終於搜尋到問題所在:

/************************************************************/

問:為了可以順序訪問Session的狀態值,Session是否提供了鎖定機制?
答:Session實現了Reader/Writer的鎖機制:
當頁面對Session具有可寫功能(即頁面有標記),此時直到請求完成該頁面的Session持有一個寫鎖定。
當頁面對Session具有隻讀功能(即頁面有標記),此時知道請求完成該頁面的Session持有一個讀鎖定。
讀鎖定將阻塞一個寫鎖定;讀鎖定不會阻塞讀鎖定;寫鎖定將阻塞所有的讀寫鎖定。這就是為什麼兩個框架中的同一個頁面都去寫同一個Session時,其中一個要等待另一個(稍快的那個)完成後,才開始寫。

 

可檢視這裡http://www.jb51.net/article/9442.htm

/************************************************************/

 

“寫鎖定將阻塞所有的讀寫鎖定”,也就是說頁面在EnableSessionState="True"的情況下沒返回輸出時,一直持著 Session寫操作,其他頁面對Session的讀操作必須等待,而asp.net的aspx頁面預設是 EnableSessionState="True",每個頁面從請求開始至返回一直持著Session寫操作,需驗證頁面必須讀取Session值判 斷,這就是為什麼需驗證的頁面請求被阻塞的原因。只要耗時頁面(A頁面)沒有Session的寫操作,也就不會阻塞其他頁面的請求,於是修改A頁面的 EnableSessionState="ReadOnly",例如: ,問題解決。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-624594/,如需轉載,請註明出處,否則將追究法律責任。

相關文章