用戶端:通道處理站與通道
這個主題會討論通道處理站和通道的建立方面。
通道處理站與通道
通道處理站會負責建立通道。 而通道處理站所建立的通道會用於傳送訊息。 這些通道會負責從上層取得訊息、執行必須的處理動作,然後將訊息傳送至下層。 下圖會說明這個程序。
通道處理站會建立通道。
關閉時,通道處理站會負責關閉所建立但尚未關閉的任何通道。 請注意,此處的模型為非對稱,這是因為關閉通道接聽項時,只會停止接受新通道,但會讓現有的通道保持為開啟,這樣才可以繼續接收訊息。
WCF 會提供此處理序的基底類別協助程式。 (如需本主題討論的通道協助程式類別圖表,請參閱 通道模型概觀)。
CommunicationObject 類別會實作 ICommunicationObject 並強制執行步驟 2 開發通道中所述的狀態電腦。
ChannelManagerBase 類別會實作 CommunicationObject,並為 System.ServiceModel.Channels.ChannelFactoryBase 和 System.ServiceModel.Channels.ChannelListenerBase 提供統一的基底類別。 ChannelManagerBase 類別可以和 ChannelBase 一起運作,而後者是實作 IChannel 的基底類別。
ChannelFactoryBase 類別會實作 ChannelManagerBase 和 IChannelFactory,並且將
CreateChannel
多載合併為單一OnCreateChannel
抽象方法。ChannelListenerBase 類別會實作 IChannelListener。 它會負責基礎的狀態管理。
下列討論將以傳輸: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
);