共用方式為


用戶端:通道處理站與通道

這個主題會討論通道處理站和通道的建立方面。

通道處理站與通道

通道處理站會負責建立通道。 而通道處理站所建立的通道會用於傳送訊息。 這些通道會負責從上層取得訊息、執行必須的處理動作,然後將訊息傳送至下層。 下圖會說明這個程序。

Client Factories and Channels
通道處理站會建立通道。

關閉時,通道處理站會負責關閉所建立但尚未關閉的任何通道。 請注意,此處的模型為非對稱,這是因為關閉通道接聽項時,只會停止接受新通道,但會讓現有的通道保持為開啟,這樣才可以繼續接收訊息。

WCF 會提供此處理序的基底類別協助程式。 (如需本主題討論的通道協助程式類別圖表,請參閱 通道模型概觀)。

下列討論將以傳輸:UDP 範例為基礎。

建立通道處理站y

UdpChannelFactory 是衍生自 ChannelFactoryBase。 範例會覆寫 GetProperty,以提供訊息編碼器之訊息版本的存取權。 當狀態電腦進行轉換時,該範例也會覆寫 OnClose 以終止 BufferManager 的執行個體。

UDP 輸出通道

UdpOutputChannel 會實作 IOutputChannel。 建構函式會驗證引數,並根據傳進的 EndPoint 建構目的地 EndpointAddress 物件。

覆寫 OnOpen 後會建立用於將訊息傳送至此 EndPoint 的通訊端 (Socket)。

this.socket = new Socket(  
this.remoteEndPoint.AddressFamily,
  SocketType.Dgram,
  ProtocolType.Udp
);  

可以依正常程序或非正常程序關閉通道。 如果依正常程序關閉通道,將會關閉通訊端,並且會呼叫基底類別 OnClose 方法。 如果因此發生例外狀況,則基礎結構會呼叫 Abort,確保已清除通道。

this.socket.Close();  
base.OnClose(timeout);  

實作 Send()BeginSend()/EndSend()。 這分成兩個主要區段。 首先,將訊息序列化為位元組陣列:

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

然後在 Wire 上傳送產生的資料:

this.socket.SendTo(  
  messageBuffer.Array,
  messageBuffer.Offset,
  messageBuffer.Count,
  SocketFlags.None,
  this.remoteEndPoint  
);  

另請參閱