用戶填寫複雜表單耗時較長,若超過 Session 逾期時間(預設 20 分鐘),提交時會發生 Session 遺失、資料全失的慘劇。單純延長 `timeout` 會造成伺服器記憶體壓力。Heartbeat (心跳) 模式 透過客戶端定時非同步呼叫伺服器,在不增加 Session 逾期設定的前提下,維持 Session 活躍。
<system.web>
<sessionState timeout="2" /> <!-- 2 分鐘 -->
</system.web>
void Session_Start(object sender, EventArgs e) { ODS("Session_Start"); }
void Session_End(object sender, EventArgs e) { ODS("Session_End"); }
public static void ODS(string msg)
{
System.Diagnostics.Debug.WriteLine($"{DateTime.Now:hh:mm:ss.ff} {msg}");
}
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
[WebMethod(EnableSession = true)]
public static void PokePage()
{
// 僅需觸發 Session 存取即可重置滑動逾期
ODS("Server: I am poked");
}
<script>
setInterval(function () {
PageMethods.PokePage();
}, 60000); // 每 60 秒呼叫一次,小於 Session 逾期
</script>