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

基於 WCF 的無人終端遠端監控架構演進實錄

     編輯:關於.NET

專案需遠端即時監控多台無人終端運行狀態,並支援下發控制指令。經過三輪架構重構,最終採用「服務端裝載於控制端、終端為輕量 Client」的雙工通訊模型。本文記錄演進過程與關鍵設計決策。

業務需求

  • 監:終端主動即時推送狀態(心跳、日誌、資源使用率)至控制端。
  • 控:控制端下發指令(重啟、更新、配置變更),終端執行並回報結果。
  • 拓撲:一對多(一終端可被多控制端監控;一控制端可管多終端)。核心服務邏輯應運行於控制端。

第一版:單一服務雙向操作(耦合度高)

[ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(IServiceCallback))]
public interface IService {
    [OperationContract] void Operation();      // 控制端→終端
    [OperationContract] void UpdateStatus();   // 終端→控制端
}
public interface IServiceCallback {
    void ReceiveCommand(); void ReceiveStatus();
}
// 服務端用靜態 List 廣播,終端與控制端共用同一服務介面
// 缺點:雙向操作暴露給雙方,安全性差;服務端自我回調邏輯混亂。

第二版:拆分終端/控制服務(介面清晰,但資源浪費)


// 終端服務
[ServiceContract(CallbackContract=typeof(ITerminalCallback))]
public interface ITerminalService { [OperationContract] void UpdateStatus(); }
public interface ITerminalCallback { void ReceiveCommand(); }

// 控制服務
[ServiceContract(CallbackContract=typeof(IControlCallback))]
public interface IControlService { [OperationContract] void Operation(); }
public interface IControlCallback { void ReceiveStatus(); }

// 兩服務透過靜態 List 交換回調通道
// 缺點:每終端需獨立裝載 TerminalService,單一軟體終端佔用獨立服務實例,資源浪費。

第三版:控制端裝載服務,終端為輕量 Host(最終方案)

[ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(IServiceCallback))]
public interface IService {
    [OperationContract] void Operation(); // 控制端呼叫,實際觸發終端事件
}
public interface IServiceCallback { void ReceiveStatus(); } // 僅控制端實作

public static class Global {
    public static List Callbacks = new List();
    public static ReceiveCommandHandler ReceiveCommand; // 終端註冊的事件
}

[ServiceBehavior]
public class Service : IService, IDisposable {
    IServiceCallback _cb;
    public Service() {
        _cb = OperationContext.Current.GetCallbackChannel();
        Global.Callbacks.Add(_cb);
    }
    public void Operation() { // 控制端呼叫
        if (Global.ReceiveCommand != null) Global.ReceiveCommand();
    }
    public void Dispose() { Global.Callbacks.Remove(_cb); }
}

// 終端側輕量封裝
public delegate void ReceiveCommandHandler();
public class ServiceHost {
    public event ReceiveCommandHandler ReceiveCommand {
        add { Global.ReceiveCommand += value; }
        remove { Global.ReceiveCommand -= value; }
    }
    public void UpdateStatus() { // 終端主動呼叫推送狀態
        foreach (var cb in Global.Callbacks) cb.ReceiveStatus();
    }
    public void Start() { /* 啟動 ServiceHost */ }
    public void Stop() { /* 停止 */ }
}

架構優勢

  • 職責單一:服務介面僅暴露控制端操作(Operation),終端僅透過事件接收指令、呼叫 UpdateStatus 推送狀態。
  • 資源高效:單一服務實例服務多終端,終端無需裝載 WCF 服務,僅持有事件委派。
  • 安全可控:終端無法直接呼叫服務操作,僅能被動接收指令、主動上報。
  • 擴展性:新增指令類型只需擴充 ReceiveCommandHandler 簽名或引入命令模式。

部署注意事項

  • 採用 NetTcpBinding + SessionMode.Required 確保雙工通道可靠。
  • 控制端需設定 serviceThrottling 最大並發連線數。
  • 終端網路斷線重連邏輯需在 ServiceHost 內實作(心跳檢測 + 自動重連)。
  • 生產環境建議引入訊息簽章/加密(Security_Module),防範中間人攻擊。

此架構已在多專案驗證,穩定支撐百台級終端監控場景。

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