前年有個Asp.net項目上線后,正常情況下大部分頁面打開速度都很快,但個別頁面處理速度較慢。奇怪的是一旦訪問個別速度慢的頁面后,在該頁面還未響應完畢前再去訪問任何其他頁面都需要等待很久才有響應。
經過仔細分析和查找,原來發現罪魁禍首是Session阻塞造成的。默認情況下session狀態是“可寫狀態”(EnableSessionState=”true”),即當用戶打開任何一個頁面時,該頁面的Session就會持有一個寫鎖定,寫鎖定會阻塞所有的讀寫鎖定,故只有等該頁面處理完畢后才釋放對應的Session寫鎖定,在釋放之前訪問其他頁面時將被阻塞住。詳細描述如下:
當頁面對Session具有可寫功能(即頁面有<%@ Page EnableSessionState="True" %>標記),此時直到請求完成該頁面的Session持有一個寫鎖定。
當頁面對Session具有只讀功能(即頁面有<%@ Page EnableSessionState="ReadOnly" %>標記),此時知道請求完成該頁面的Session持有一個讀鎖定。
讀鎖定將阻塞一個寫鎖定;讀鎖定不會阻塞讀鎖定;寫鎖定將阻塞所有的讀寫鎖定。
所以將各頁面標記為<%@ Page EnableSessionState="ReadOnly" %>可解決此問題。也可在web.config中統一修改各頁面的默認session狀態:
<pages validateRequest="false" enableSessionState="ReadOnly"> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </controls> </pages>
對於個別頁面確實需要寫session權限的(例如有session[“aa”]=”bb”之類的操作),可以單獨設置該頁面標記為
<%@ Page EnableSessionState="True" %>
參考資料:
http://www.anqn.com/aspx/2010-04-30/a09126048.shtml
http://www.cnblogs.com/flier/archive/2004/08/07/30902.html