asp.net Session造成請求阻塞現象
現象:在一個網站中,當訪問一個處理比較耗時的頁面(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 無線認證請求過多造成WLC-Radius擁堵崩潰現象就及解決方法
- tornado非同步請求非阻塞非同步
- ASP.NET Core - 實現Http自定義請求頭策略ASP.NETHTTP
- 管理工具造成的阻塞
- ASP.NET:EntityFramework實現SessionASP.NETFrameworkSession
- oracle session阻塞查詢OracleSession
- blocking_session阻塞BloCSession
- ASP.Net請求處理機制初步探索之旅(5):ASP.Net MVC請求處理流程ASP.NETMVC
- flask路由系統、偏函式、CBV、模板、請求響應、session、請求擴充套件Flask路由函式Session套件
- ajax的post請求,用於asp.net ?ASP.NET
- 檢視引起阻塞的SessionSession
- 精講響應式WebClient第2篇-GET請求阻塞與非阻塞呼叫方法詳解Webclient
- 多執行緒應用–Http請求阻塞回撥處理執行緒HTTP
- 多執行緒應用--Http請求阻塞回撥處理執行緒HTTP
- Python 使用socket模擬http請求,從阻塞到協程PythonHTTP
- 理解ASP.NET Core - 傳送Http請求(HttpClient)ASP.NETHTTPclient
- ASP.NET Core獲取請求完整的UrlASP.NET
- ASP.NET Core - 請求管道與中介軟體ASP.NET
- iOS 同步請求 非同步請求 GET請求 POST請求iOS非同步
- React 解決fetch跨域請求時session失效React跨域Session
- spring security:ajax請求的session超時處理SpringSession
- 檢視瀏覽器請求的session 瀏覽器怎麼檢視session瀏覽器Session
- Java實現Http請求JavaHTTP
- JS實現序列請求JS
- Oracle中診斷阻塞的sessionOracleSession
- 從 1 秒到 10 毫秒!在 APISIX 中減少 Prometheus 請求阻塞APIPrometheus
- 記錄我的Express-session每次請求都重新生成session的問題ExpressSession
- 資料庫自動收縮造成的阻塞資料庫
- asp.Net請求過程及管道中的事件ASP.NET事件
- 用whistle實現Abort請求
- KKB : Jquery實現Ajax請求jQuery
- java實現https請求JavaHTTP
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- 非同步請求PHP伺服器,你如何做到無阻塞響應非同步PHP伺服器
- Java,InputStream,Socket阻塞.(關於HTTP請求的IO問題自我總結)JavaHTTP
- 請求框架&移動請求框架
- 為什麼sleeping的會話會造成阻塞會話
- 模擬insert,update和delete造成阻塞的示例delete