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

WCF 雙向通訊實戰:Session 管理架構設計 (上)

     編輯:關於.NET

從 Remoting 租約機制汲取靈感

傳統 Web 應用依賴 Server 端 Session 存儲,但在分散式 WCF 架構下,若採用 Client 輪詢檢查狀態,不僅即時性差、網路開銷大,高併發時更會拖垮服務端。本文採用服務端主導模式,靈感源自 .NET Remoting 的 Lease/Sponsor 機制:物件生命週期由租約控管,到期前由 Sponsor (Client 端) 協商續約時間。

核心流程設計

  1. StartSession:Client 傳入 SessionClientInfo (IP、HostName、UserName),Service 建立 SessionInfo (含 Guid SessionID)、存入 CurrentSessionList,同時取得 Client Callback 存入 CurrentCallbackList,回傳 SessionID 與 Timeout 設定。
  2. 定期輪詢:Service 端 Timer 定期掃描 CurrentSessionList,判斷 Now - LastActivityTime > Timeout 者需 Renew。
  3. 非同步 Renew 協商:對需 Renew 的 Session,透過 Callback 呼叫 Client Renew(),Client 依據本地「最後滑鼠操作時間」計算剩餘可延長時間 (TimeSpan) 回傳。
  4. 結果處理:
    • 回傳 > 0:延長 LastActivityTime。
    • 回傳 ≤ 0 或通訊異常:判定逾時,Callback OnSessionTimeout 通知 Client,標記 IsTimeout = true。
  5. 強制終止:管理員呼叫 KillSessions,移除 Session 並 Callback OnSessionKilled。

為何不直接回傳 LastActivityTime?

避免假設 Client/Server 時鐘同步。Client 端自行計算「距離逾時剩餘時間」回傳,Server 累加即可,消除時鐘偏移風險。

資料合約與服務合約定義

SessionClientInfo (Client 傳入)

[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; }
}

SessionInfo (Service 追蹤)

[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; }
}

Callback Contract

public interface ISessionCallback
{
    [OperationContract] TimeSpan Renew();
    [OperationContract(IsOneWay = true)] void OnSessionKilled(SessionInfo sessionInfo);
    [OperationContract(IsOneWay = true)] void OnSessionTimeout(SessionInfo sessionInfo);
}

Service Contract

[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 互動程式碼與完整執行畫面驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved