首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET Heartbeat 模式:讓 Session 在長時間表單操作中保持存活

     編輯:關於ASP.NET

用戶填寫複雜表單耗時較長,若超過 Session 逾期時間(預設 20 分鐘),提交時會發生 Session 遺失、資料全失的慘劇。單純延長 `timeout` 會造成伺服器記憶體壓力。Heartbeat (心跳) 模式 透過客戶端定時非同步呼叫伺服器,在不增加 Session 逾期設定的前提下,維持 Session 活躍。

實作步驟

1. 設定較短 Session 逾期 (測試用)

<system.web>
  <sessionState timeout="2" /> <!-- 2 分鐘 -->
</system.web>

2. 全域追蹤 Session 事件 (除錯用)

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}");
}

3. 網頁加入 ScriptManager 啟用 PageMethods

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />

4. 定義靜態 WebMethod 心跳端點

[WebMethod(EnableSession = true)]
public static void PokePage()
{
    // 僅需觸發 Session 存取即可重置滑動逾期
    ODS("Server: I am poked");
}

5. 客戶端 JavaScript 定時呼叫

<script>
    setInterval(function () {
        PageMethods.PokePage();
    }, 60000); // 每 60 秒呼叫一次,小於 Session 逾期
</script>

運作原理

  1. 頁面載入後,`setInterval` 每 60 秒呼叫 `PokePage()`。
  2. `EnableSession=true` 使 ASP.NET 在進入方法前載入 Session,自動重置滑動逾期計時器。
  3. 用戶關閉瀏覽器/頁面,`setInterval` 停止,Session 於設定時間後自然過期釋放記憶體。

進階優化

  • 使用 `WebSocket` 或 `SignalR` 替代輪詢,降低連線開銷。
  • 心跳端點可回傳伺服器時間、通知訊息等額外資訊。
  • 結合 `beforeunload` 事件發送同步 `navigator.sendBeacon()` 通知伺服器立即釋放 Session。

適用場景

  • 長表單、精靈式流程、線上考試、報稅系統等單頁停留時間不可預期的應用。
  • 不想調高全站 Session timeout 造成資源浪費的專案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved