WCF 提供三種核心訊息交換模式 (MEP),滿足不同業務場景的通訊需求。
NetPeerTcpBinding、NetMsmqBinding 外,所有綁定支援。[OperationContract(IsOneWay = true)],回傳型別 必須為 void。IsTerminating=true)。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))。服務持有鎖呼叫回呼,回呼又需進入同一服務實例 → 死鎖。三種解法:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 多執行緒 (需自行處理執行緒安全)。[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 重進模式:呼叫回呼時釋放鎖,回呼返回後重新取得。[OperationContract(IsOneWay = true)],無回應訊息,服務不等待直接繼續。| 場景 | 推薦 MEP | 關鍵綁定 |
|---|---|---|
| 一般 RPC、查詢 | Request-Reply | 全部 |
| 事件通知、日誌、非關鍵指令 | One-Way | 全部 |
| 進度通知、即時推送、聊天 | Duplex | NetTcpBinding, NetNamedPipeBinding, WSDualHttpBinding |