傳統 WCF 服務採用請求-回覆模式,客戶端發起呼叫,服務被動回應。雙工服務打破這一限制,允許服務主動向客戶端發起通訊(回呼),實現真正的雙向即時通訊。典型應用包括:即時通訊、股票報價推送、協同編輯、遊戲狀態同步等。
CallbackContract 指定回呼型別WSDualHttpBinding、NetTcpBinding)[ServiceContract]
public interface ICallbackContract
{
[OperationContract(IsOneWay = true)]
void ServerReply(string originalMessage);
}
[ServiceContract(CallbackContract = typeof(ICallbackContract))]
public interface IChatContract
{
[OperationContract(IsOneWay = true)]
void SendMessage(string message);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class ChatService : IChatContract
{
public void SendMessage(string message)
{
Console.WriteLine($"{DateTime.Now} 收到訊息: {message}");
// 取得回呼通道,主動呼叫客戶端
var callback = OperationContext.Current.GetCallbackChannel<ICallbackContract>();
callback.ServerReply($"伺服器已處理: {message}");
}
}
關鍵點:ConcurrencyMode.Multiple 允許多線程並發處理請求,避免回呼時死鎖。
public class CallbackHandler : ICallbackContract
{
public void ServerReply(string originalMessage)
{
Console.WriteLine($"{DateTime.Now} 收到伺服器回覆: {originalMessage}");
}
}
class ChatServiceClient : ClientBase<IChatContract>, IChatContract
{
public ChatServiceClient(InstanceContext callback, Binding binding, EndpointAddress address)
: base(callback, binding, address) { }
public void SendMessage(string message) => Channel.SendMessage(message);
}
// 主程式
static void Main()
{
var binding = new WSDualHttpBinding(); // 必須使用雙工繫結
var address = new EndpointAddress("https://localhost:9000/ChatService");
var callback = new CallbackHandler();
var proxy = new ChatServiceClient(new InstanceContext(callback), binding, address);
Console.Write("請輸入訊息 (Exit 離開): ");
while ((input = Console.ReadLine()) != "Exit")
{
proxy.SendMessage(input);
Console.Write("請輸入訊息 (Exit 離開): ");
}
}
InstanceContext 包裝回呼物件實例,管理其生命週期與併發行為。它是雙工通訊的基石,確保服務能正確路由回呼訊息至特定客戶端實例。
| 繫結 | 傳輸 | 適用場景 |
|---|---|---|
| WSDualHttpBinding | HTTP | 跨防火牆、互聯網環境 |
| NetTcpBinding | TCP | 內部網路、高效能需求 |
| NetNamedPipeBinding | Named Pipe | 同機器進程間通訊 |
WSDualHttpBinding 實際上建立兩個 HTTP 通道:客戶端→服務、服務→客戶端。客戶端必須可被外部存取(需開放連接埠),這在企業防火牆後可能需額外配置。內網環境建議優先使用 NetTcpBinding。
SendTimeout、ReceiveTimeout 設定IsOneWay=true、客戶端防火牆、InstanceContext 生命週期ConcurrencyMode.Multiple 或 ReentrantWCF 雙工服務透過回呼契約與雙工繫結,優雅地實現了伺服器主動推送能力。掌握 InstanceContext、併發模式、繫結選擇等核心概念,即可建構穩健的即時通訊應用。