傳統 Web 應用依賴 Server 端 Session 存儲,但在分散式 WCF 架構下,若採用 Client 輪詢檢查狀態,不僅即時性差、網路開銷大,高併發時更會拖垮服務端。本文採用服務端主導模式,靈感源自 .NET Remoting 的 Lease/Sponsor 機制:物件生命週期由租約控管,到期前由 Sponsor (Client 端) 協商續約時間。
SessionClientInfo (IP、HostName、UserName),Service 建立 SessionInfo (含 Guid SessionID)、存入 CurrentSessionList,同時取得 Client Callback 存入 CurrentCallbackList,回傳 SessionID 與 Timeout 設定。CurrentSessionList,判斷 Now - LastActivityTime > Timeout 者需 Renew。Renew(),Client 依據本地「最後滑鼠操作時間」計算剩餘可延長時間 (TimeSpan) 回傳。LastActivityTime。OnSessionTimeout 通知 Client,標記 IsTimeout = true。KillSessions,移除 Session 並 Callback OnSessionKilled。避免假設 Client/Server 時鐘同步。Client 端自行計算「距離逾時剩餘時間」回傳,Server 累加即可,消除時鐘偏移風險。
[DataContract]
public class SessionClientInfo
{
[DataMember] public string IPAddress { get; set; }
[DataMember] public string HostName { get; set; }
[DataMember] public string UserName { get; set; }
[DataMember] public IDictionary<string, string> ExtendedProperties { get; set; }
}
[DataContract]
[KnownType(typeof(SessionClientInfo))]
public class SessionInfo
{
[DataMember] public Guid SessionID { get; set; }
[DataMember] public DateTime StartTime { get; set; }
[DataMember] public DateTime LastActivityTime { get; set; }
[DataMember] public SessionClientInfo ClientInfo { get; set; }
public bool IsTimeout { get; set; }
}
public interface ISessionCallback
{
[OperationContract] TimeSpan Renew();
[OperationContract(IsOneWay = true)] void OnSessionKilled(SessionInfo sessionInfo);
[OperationContract(IsOneWay = true)] void OnSessionTimeout(SessionInfo sessionInfo);
}
[ServiceContract(CallbackContract = typeof(ISessionCallback))]
public interface ISessionManagement
{
[OperationContract] Guid StartSession(SessionClientInfo clientInfo, out TimeSpan timeout);
[OperationContract] void EndSession(Guid sessionID);
[OperationContract] IList<SessionInfo> GetActiveSessions();
[OperationContract] void KillSessions(IList<Guid> sessionIDs);
}
經典四層:Contract、Service、Hosting (Console + netTcpBinding)、Client (WinForm)。Hosting 端 appSettings 設定 SessionTimeout = 0.5 分鐘 (30 秒) 供測試。
下一篇將詳細展示 SessionManager 核心邏輯、RenewSessions 非同步實作細節、Client 端 WinForm 互動程式碼與完整執行畫面驗證。