在之前有討論到不同網頁使用到 Writeable Session 時會卡來卡去的狀況 Lock or Blocking( 使用 Session 要小心網頁會被 卡住哦! ),或是 Web Service 如果開啟 Session 存取的話,預設是 Writeable Session 模式(設定 WebService 使用 ReadOnly Session)。
解法除了設定 SessionStateBehavior.ReadOnly 外,如果一定要用 Writeable Session 時(怕改成 ReadOnly 會影響現有系統的話),可以參考When a Single ASP.NET Client makes Concurrent Requests for Writeable Session Variables提供的方式,因為在寫入 Session 時會造成 500ms 的 Delay 時間(請參考:Storing Anything in ASP.NET Session Causes 500ms Delays),
降低 Session Lock Check 的時間
可以在 Global.asax.cs 的 Application_Start Method 去設定預設值, Polling Interval 從 500ms 改成 30ms, Polling Delta 從 250ms 改成 15ms ,如下,
1
2
3
4
5
6
7
8
9
10protected void Application_Start(object sender, EventArgs e)
{
var sessionStateModuleType = typeof(SessionStateModule);
var pollingIntervalFieldInfo = sessionStateModuleType.GetField("LOCKED_ITEM_POLLING_INTERVAL", BindingFlags.NonPublic | BindingFlags.Static);
var orgpollingInterval = pollingIntervalFieldInfo.GetValue(null);
pollingIntervalFieldInfo.SetValue(null, 30); // default 500ms
var pollingDeltaFieldInfo = sessionStateModuleType.GetField("LOCKED_ITEM_POLLING_DELTA", BindingFlags.NonPublic | BindingFlags.Static);
var orgPollingDelta = pollingDeltaFieldInfo.GetValue(null);
pollingDeltaFieldInfo.SetValue(null, TimeSpan.FromMilliseconds(15.0)); // default 250ms
}
1 | public class LocklessInProcSessionStateStore : SessionStateStoreProviderBase |
#### 在 web.config 中加入設定自定的 SessionState,如下,
1
2
3
4
5
6
7
<sessionState mode="Custom" customProvider="LocklessInProcSessionStateStore" cookieless="false" timeout="1" >
<providers>
<add name="LocklessInProcSessionStateStore"
type="你專案的namespace.LocklessInProcSessionStateStore"/>
</providers>
</sessionState>