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

WCF 進階之旅(一):Binding 如何驅動通訊全流程

     編輯:關於.NET

《我的 WCF 之旅》系列榮登博客園 2007 年度系列部落格 Top 10。新系列將深入探討 WCF 實作機制、設計原理與實戰擴展經驗。本文先從核心——Communication 切入,剖析 WCF 如何透過 Binding 完成通訊,並介紹 Channel、Channel Listener、Channel Factory、Binding Element、Channel Shape 等關鍵概念。

Binding:通訊細節的總管

WCF 架構分兩層:Channel Layer(訊息傳輸管道)與 Service Layer(開發程式模型)。一般開發者只接觸 Service Layer,但若要掌握 WCF 的高擴展性,理解 Channel Layer 是必經之路。Binding 是 Service Layer 進入 Channel Layer 的入口,也是兩層的中介——它「實作所有通訊細節」,背後靠的正是 Channel Layer。

範例:直接用 BasicHttpBinding 進行通訊

這個極簡範例模擬傳統 Socket 程式:Server Listen → Accept → Process → Reply;Client Send → Receive。兩個 Console App 分別為 Server/Client。

專案結構

Server 端核心邏輯

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 回覆。

Client 端核心邏輯

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() 發送並同步等待回覆。

Client 執行畫面 Server 執行畫面

Channel:訊息處理器的鏈結

傳輸、編碼、安全、交易、可靠傳訊、壓縮、記錄……單一 Channel 無法包辦。WCF 設計成 Channel Stack:一串專注單一功能的 Channel 依序組成管道,訊息在管道中流動。Transport Channel 位置固定:Sender 端最尾端、Receiver 端最前端。所有 Channel 直接/間接實作 IChannel,通常繼承 ChannelBase。

Channel Shape:MEP 決定 Channel 角色

不同 MEP 下,雙方 Channel 角色不同,這種結構差異稱 Channel Shape:

  • Datagram(One-way):Sender = IOutputChannel,Receiver = IInputChannel
  • Request/Reply:Sender = IRequestChannel,Receiver = IReplyChannel
  • Duplex:雙向 = IDuplexChannel(= Output + Input)
  • P2P:點對點 = IDuplexChannel

範例使用 Request/Reply,故 Client 建 IRequestChannel、Server 建 IReplyChannel。

Channel Manager:Factory 與 Listener

Channel 不直接 new,而是由 Channel Manager 建立管理:

  • 發送端:Channel Factory(IChannelFactory<TChannel>),單純建立 Channel 發送/接收回覆
  • 接收端:Channel Listener(IChannelListener<TChannel>),綁定 URI 監聽,收到請求才建立 Channel 處理

Channel Stack 之上,對應形成 Factory/Listener Stack。

Binding 與 Binding Element

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 Layer 的路徑

若現有 Channel 無法滿足需求(如 Message Body 壓縮),需自訂 Channel + 配套 Factory/Listener/Binding Element,最終組成 Custom Binding。下一篇將詳細示範完整實作步驟。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved