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

WCF 訊息交換模式:Request-Reply、One-Way 與 Duplex 回呼完整解析

     編輯:關於.NET

WCF 提供三種核心訊息交換模式 (MEP),滿足不同業務場景的通訊需求。

1. Request-Reply (請求-回應) - 預設模式

  • 用戶端發送請求 → 阻塞等待 → 服務處理 → 回傳回應 → 用戶端繼續。
  • 除 NetPeerTcpBinding、NetMsmqBinding 外,所有綁定支援。
  • 適用:即時查詢、CRUD 操作、需確認結果的業務。

2. One-Way (單向) - 快速通知

  • 用戶端發送 → 立即返回 (僅排入通道佇列) → 服務稍後處理,無回應。
  • 所有綁定支援。
  • 契約設定:[OperationContract(IsOneWay = true)],回傳型別 必須為 void。
  • 佇列滿時會阻塞用戶端;異常不會傳回用戶端 (視實例模式與綁定而定)。
  • 會話合約中單向操作 必須為終止操作 (IsTerminating=true)。

3. Duplex (雙工/回呼) - 伺服器主動推送

  • 需雙向通道:用戶端暴露回呼端點,服務透過 OperationContext.Current.GetCallbackChannel<T>() 主動呼叫用戶端。
  • 支援綁定:NetTcpBinding、NetNamedPipeBinding、WSDualHttpBinding (雙 HTTP 通道)。BasicHttpBinding/WSHttpBinding 不支援。
  • 契約結構:
    public interface ICallback { [OperationContract(IsOneWay=true)] void OnProgress(int p); }
    [ServiceContract(CallbackContract = typeof(ICallback))]
    public interface IService { [OperationContract] void DoWork(); }
  • 服務端取得回呼通道:
    var callback = OperationContext.Current.GetCallbackChannel<ICallback>();
    callback.OnProgress(50);
  • 用戶端實作回呼介面,以 InstanceContext 建立 Proxy:new ServiceClient(new InstanceContext(callbackImpl))。

死鎖風險與解決

服務持有鎖呼叫回呼,回呼又需進入同一服務實例 → 死鎖。三種解法:

  1. [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 多執行緒 (需自行處理執行緒安全)。
  2. [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 重進模式:呼叫回呼時釋放鎖,回呼返回後重新取得。
  3. 回呼標記 [OperationContract(IsOneWay = true)],無回應訊息,服務不等待直接繼續。

實例模式影響

  • PerCall:每次呼叫新實例,回呼參考不可跨呼叫保存。
  • PerSession:單一用戶端對應單一實例,適合維護回呼狀態。
  • Singleton:全域單一實例,回呼參考計數增長需手動管理清理。

總結選型指引

場景推薦 MEP關鍵綁定
一般 RPC、查詢Request-Reply全部
事件通知、日誌、非關鍵指令One-Way全部
進度通知、即時推送、聊天DuplexNetTcpBinding, NetNamedPipeBinding, WSDualHttpBinding
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved