用戶端:通道處理站與通道
這個主題會討論通道處理站和通道的建立方面。
通道處理站與通道
通道處理站會負責建立通道。而通道處理站所建立的通道會用於傳送訊息。這些通道會負責從上層取得訊息、執行必須的處理動作,然後將訊息傳送至下層。下圖會說明這個程序。
關閉時,通道處理站會負責關閉所建立但尚未關閉的任何通道。請注意,此處的模型為非對稱,這是因為關閉通道接聽項時,只會停止接受新通道,但會讓現有的通道保持為開啟,這樣才可以繼續接收訊息。
WCF 會提供此處理序的基底類別協助程式 (如需本主題討論的通道協助程式類別圖表,請參閱通道模型概觀)。
- CommunicationObject 類別會實作 ICommunicationObject 並強制執行開發通道步驟 2 中所述的狀態電腦。
CreateChannel
多載合併為單一OnCreateChannel
抽象方法中。
下列討論將以Transport: UDP 範例為基礎。
建立通道處理站y
``UdpChannelFactory
是衍生自 ChannelFactoryBase。範例會覆寫 GetProperty,以提供訊息編碼器之訊息版本的存取權。當狀態電腦進行轉換時,該範例也會覆寫 OnClose 以終止 BufferManager 的執行個體。
UDP 輸出通道
``UdpOutputChannel
會實作 IOutputChannel。建構函式會驗證引數,並根據傳進的 EndpointAddress 建構目的地 EndPoint 物件。
覆寫 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
);