現(xiàn)象:在一個網站中,當訪問一個處理比較耗時的頁面(A頁面),頁面請求還沒有返回時,此時再點擊訪問該網站的其他頁面(B頁面)會出現(xiàn)B頁面很久都沒有響應和返回,直到A頁面輸出返回數據時才開始處理B頁面的請求,造成請求排隊處理,A頁面阻塞了B頁面的請求處理。
開始我一直懷疑是不是瀏覽器單線程的緣故,在網上搜索了資料,IE6/7,F(xiàn)F都是多線程瀏覽器(IE6好像是2個線程),用IE6、IE7、FF都試過了,結果一樣,這就奇怪了,明明都是多線程,怎么會阻塞呢?
在網上搜索了好幾次相關的問題,還是沒查出個所以然,但網站造成的客戶體驗確實很差,每當訪問到那個耗時的A頁面時,再想訪問其他頁面根本查看不了。"怎么系統(tǒng)那么慢",暈,沒辦法,我也不懂怎么處理(不負責任的態(tài)度啊,呵呵)。
在一次的無意中我發(fā)現(xiàn)竟然在A頁面Loading(頁面上加的提示)的時候,可以訪問某個頁面,真是驚喜,再試試幾次,可以,確實可以,是不是頁面代碼阻塞了?于是查這兩個頁面的代碼,其實這兩個頁面的代碼就十幾行,沒什么問題呢。
經過多次嘗試和比對,才發(fā)現(xiàn)這兩個頁都是無需登陸驗證的頁面,之前出現(xiàn)阻塞的頁面都是需登陸驗證后才可訪問的頁面,而系統(tǒng)的驗證信息是存儲在Session中,通過Session判斷驗證的。這時想到應該是Session的問題,但還是不知如何處理,再去網上搜索,互聯(lián)網上的信息真是應有盡有,終于搜索到問題所在:
/************************************************************/
問:為了可以順序訪問Session的狀態(tài)值,Session是否提供了鎖定機制?
答:Session實現(xiàn)了Reader/Writer的鎖機制:
當頁面對Session具有可寫功能(即頁面有<%@ Page EnableSessionState="True" %>標記),此時直到請求完成該頁面的Session持有一個寫鎖定。
當頁面對Session具有只讀功能(即頁面有<%@ Page EnableSessionState="ReadOnly" %>標記),此時知道請求完成該頁面的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",例如:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TBS_Monitor_List.aspx.cs" EnableSessionState="ReadOnly"? Inherits="TBS_Monitor_List" %> ,問題解決。
關鍵詞標簽:ASP.NET,Session
相關閱讀
熱門文章 誅仙3飛升任務怎么做-誅仙3飛升任務流程最新2022 鐘離圣遺物推薦-原神鐘離圣遺物詞條 解決方法:應用程序“DEFAULT WEB SITE”中的服務器錯誤 使用aspnet_regiis.exe 重新注冊.NET Framework
人氣排行 誅仙3飛升任務怎么做-誅仙3飛升任務流程最新2022 asp.net表單提交方法GET\POST 在ASP.NET中如何判斷用戶IE瀏覽器的版本 Asp.net中messagebox的實現(xiàn)方法 Asp.net中的web.config配置 在ASP.NET MVC中實現(xiàn)大文件異步上傳 asp.net獲取URL和IP地址 FileUpload上傳多文件出現(xiàn)錯誤的解決方法