定義雙工 Contract:ICalculator (Client→Service) + ICallback (Service→Client)。服務端透過 OperationContext.Current.GetCallbackChannel<ICallback>() 回呼客戶端。

// Contract
[ServiceContract(CallbackContract = typeof(ICallback))]
public interface ICalculator { [OperationContract(IsOneWay=true)] void Add(double x, double y); }
[ServiceContract] public interface ICallback { [OperationContract(IsOneWay=true)] void DisplayResult(double result); }
// Service
public void Add(double x, double y)
{
var cb = OperationContext.Current.GetCallbackChannel<ICallback>();
cb.DisplayResult(x + y);
}
// Client (DuplexChannelFactory)
var factory = new DuplexChannelFactory<ICalculator>(new InstanceContext(new CalculatorCallback()), "endpoint");
var proxy = factory.CreateChannel();
proxy.Add(1, 2);
| 維度 | HTTP 雙工 (wsDualHttpBinding) | TCP 雙工 (netTcpBinding) |
|---|---|---|
| 協議本質 | 無連線、無狀態、Request/Reply | 面向連線、全雙工、持久連線 |
| 實現機制 | 兩條獨立 HTTP 連線 (Client→Service, Service→Client) | 單一 TCP 連線雙向傳輸 |
| 防火牆/NAT 穿透 | 佳 (標準 80/443 埠) | 差 (需開放高位埠) |
| 效能/延遲 | 較高 (XML 序列化、雙連線) | 極佳 (二進位、單連線) |
| 適用場景 | 跨網域、Internet、瀏覽器客戶端 | 內網、高效能、.NET 專用 |
Client 建立監聽端點 (如 https://localhost:port/guid) 等待回呼。服務端回呼時實際發起新的 HTTP Request。WCF 以 ClientViaBehavior 管理雙通道,但本質是兩條 Request/Reply 通道組合,非真正全雙工。
TCP 三次交手建立連線後,雙向資料流共用同一 Socket。WCF netTcpBinding 直接映射此特性,單一 IDuplexChannel 即實現真正雙工,無額外開銷。
wsDualHttpBinding (或 PollingDuplex)。
理解傳輸協議對 MEP 的支援差異,才能在架構設計時做出正確選型。TCP 雙工是真正的全雙工;HTTP 雙工是兩條單工通道的巧妙組合,代價是效能與複雜度。