最近在查一個奇怪的問題,使用者反應開啟功能需要等待約 1 分 30 秒,功能才會出來。
直接去執行那個功能,最慢也是 30 秒呀! 為什麼 User 會說 1 分 30 秒呢?
環境: ASP.NET WebForms
後來 Joe Mentor 發現,有一支 Open Window 的功能(_O.aspx),會自動刷新來顯示最新的系統資訊(_O.aspx),這支程式執行很久。
當它在重新刷新網頁時,我們另外的功能(01002.aspx)也卡住了,會等到那支程式執行完後,才會跟著出來。如下圖,
之前的經驗是因為 Session 的關係,才會有這樣子的狀況。詳細可以參考「ASP.NET 工作階段狀態概觀」
並行要求和工作階段狀態
存取 ASP.NET 工作階段狀態是每一工作階段獨佔的,表示如果兩個不同的使用者同時產生要求,就會同時授與每個不同工作階段的存取權限。
但是,如果使用相同的 SessionID 值而讓相同工作階段產生兩個並行要求,第一個要求將會收到對工作階段資訊的獨佔存取。
第二個要求只能在完成第一個要求後執行。(如果因為第一個要求超出鎖定逾時而釋出對資訊的獨佔鎖定,第二個工作階段也能取得存取權)。
如果 @ Page 指示詞中的 EnableSessionState 值設定為 ReadOnly,則唯讀工作階段資訊的要求並不會導致工作階段資料的獨佔鎖定。
但是,工作階段資料的唯讀要求,仍然必須等候工作階段資料的讀寫要求清除所設定的鎖定。
查看程式發現,還好那支 Open Window(_O.aspx) 程式沒有要寫入 Session ,所以就設定 EnableSessionState="ReadOnly" ,好讓它不要影響正常的功能。
一般來說,我們應該只會在登入時,將使用者的一些設定值存到Session中,其他的功能就不要再去寫相同的Session,才不會造成這種 卡來卡去 的問題。
參考資料
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^