《我的 WCF 之旅》系列榮登博客園 2007 年度系列部落格 Top 10。新系列將深入探討 WCF 實作機制、設計原理與實戰擴展經驗。本文先從核心——Communication 切入,剖析 WCF 如何透過 Binding 完成通訊,並介紹 Channel、Channel Listener、Channel Factory、Binding Element、Channel Shape 等關鍵概念。
WCF 架構分兩層:Channel Layer(訊息傳輸管道)與 Service Layer(開發程式模型)。一般開發者只接觸 Service Layer,但若要掌握 WCF 的高擴展性,理解 Channel Layer 是必經之路。Binding 是 Service Layer 進入 Channel Layer 的入口,也是兩層的中介——它「實作所有通訊細節」,背後靠的正是 Channel Layer。
這個極簡範例模擬傳統 Socket 程式:Server Listen → Accept → Process → Reply;Client Send → Receive。兩個 Console App 分別為 Server/Client。

var address = new Uri("https://127.0.0.1:9999/messagingviabinding");
var binding = new BasicHttpBinding();
var listener = binding.BuildChannelListener<IReplyChannel>(address);
listener.Open();
var channel = listener.AcceptChannel();
channel.Open();
while (true) {
var ctx = channel.ReceiveRequest(TimeSpan.FromHours(1));
Console.WriteLine("收到請求:\n{0}", ctx.RequestMessage);
var reply = Message.CreateMessage(MessageVersion.Soap11, "", "手動建立的回覆訊息");
ctx.Reply(reply);
}
流程:建立 Address → Binding → BuildChannelListener<IReplyChannel> → Open() → AcceptChannel() 取得 IReplyChannel → 迴圈 ReceiveRequest() 取得 RequestContext → 透過 Context 回覆。
var address = new EndpointAddress("https://127.0.0.1:9999/messagingviabinding");
var binding = new BasicHttpBinding();
var factory = binding.BuildChannelFactory<IRequestChannel>();
factory.Open();
var channel = factory.CreateChannel(address);
channel.Open();
var req = Message.CreateMessage(MessageVersion.Soap11, "https://artech/messagingviabinding", "測試請求");
var reply = channel.Request(req);
Console.WriteLine("收到回覆:\n{0}", reply);
channel.Close(); factory.Close();
流程:建立 Address → Binding → BuildChannelFactory<IRequestChannel> → Open() → CreateChannel() 取得 IRequestChannel → Request() 發送並同步等待回覆。

傳輸、編碼、安全、交易、可靠傳訊、壓縮、記錄……單一 Channel 無法包辦。WCF 設計成 Channel Stack:一串專注單一功能的 Channel 依序組成管道,訊息在管道中流動。Transport Channel 位置固定:Sender 端最尾端、Receiver 端最前端。所有 Channel 直接/間接實作 IChannel,通常繼承 ChannelBase。
不同 MEP 下,雙方 Channel 角色不同,這種結構差異稱 Channel Shape:
IOutputChannel,Receiver = IInputChannelIRequestChannel,Receiver = IReplyChannelIDuplexChannel(= Output + Input)IDuplexChannel範例使用 Request/Reply,故 Client 建 IRequestChannel、Server 建 IReplyChannel。
Channel 不直接 new,而是由 Channel Manager 建立管理:
IChannelFactory<TChannel>),單純建立 Channel 發送/接收回覆IChannelListener<TChannel>),綁定 URI 監聽,收到請求才建立 Channel 處理Channel Stack 之上,對應形成 Factory/Listener Stack。
Binding 由 BindingElementCollection 組成,每個 BindingElement 負責建立 Factory 與 Listener:
public abstract class BindingElement {
public virtual IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context);
public virtual IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context);
public abstract BindingElement Clone();
// ...
}
範例中 BasicHttpBinding 內部透過其 Binding Elements 建立 Factory/Listener。
若現有 Channel 無法滿足需求(如 Message Body 壓縮),需自訂 Channel + 配套 Factory/Listener/Binding Element,最終組成 Custom Binding。下一篇將詳細示範完整實作步驟。