建立 BindingElement
繫結與繫結項目 (分別延伸 System.ServiceModel.Channels.Binding 與 System.ServiceModel.Channels.BindingElement 的物件) 就是 Windows Communication Foundation (WCF) 應用程式模型與通道處理站及通道接聽程式建立關聯的位置。 若沒有繫結,則使用自訂通道需要在通道層級進行程式設計,如服務通道層級程式設計與用戶端通道層級程式設計中所述。 此主題將討論如何在 WCF 中啟用您使用通道的最低需求、開發您通道的 BindingElement,以及如何從應用程式啟用使用 (如開發通道步驟 4 中所述)。
概觀
為通道建立 BindingElement,即可讓開發人員在 WCF 應用程式中使用您的通道。 BindingElement 物件可從 System.ServiceModel.ServiceHost 類別用於將 WCF 應用程式連線至您的通道,而不需要精確鍵入您的通道資訊。
建立 BindingElement 之後,您就可以根據需求,遵循開發通道中所述的其餘通道開發步驟來啟用更多功能。
新增繫結項目
若要實作自訂 BindingElement,請撰寫繼承自 BindingElement 的類別。 例如,如果已開發出可以將大型訊息切割為區塊並在另一端重新組合的 ChunkingChannel
,您就可以在實作 BindingElement 並設定繫結程序使用此項目後所產生的任何繫結程序中使用這個通道。 本主題的其餘部分將使用 ChunkingChannel
做為範例,示範實作繫結程序項目的需求。
ChunkingBindingElement
會負責建立 ChunkingChannelFactory
和 ChunkingChannelListener
。 它會覆寫 CanBuildChannelFactory 和 CanBuildChannelListener 實作,並檢查型別參數是否為 IDuplexSessionChannel (在我們的範例中,這是 ChunkingChannel
唯一支援的通道形狀),以及繫結中的其他繫結項目是否支援這個通道形狀。
BuildChannelFactory 會先檢查是否能建置要求的通道形狀,接著會取得要分成區塊的訊息動作清單。 然後它會建立新的 ChunkingChannelFactory
,並將此處理站傳遞至內部通道處理站 (如果是要建立傳輸繫結項目,由於該項目是繫結堆疊中的最後一個項目,因此必須建立通道接聽程式或通道處理站)。
BuildChannelListener 擁有可建立 ChunkingChannelListener
並傳遞至內部通道接聽程式的相似實作。
在另一個使用傳輸通道的範例中,傳輸:UDP 範例會提供下列覆寫。
在此範例中,繫結項目為 UdpTransportBindingElement
,其衍生自 TransportBindingElement。 它會覆寫下列方法來建置與通道關聯的處理站。
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
它還包含可以用來複製 BindingElement
以及傳回我們的結構描述 (soap.udp) 的成員。
通訊協定繫結項目
新的繫結項目可以取代或擴充任何已包含的繫結項目、新增新的傳輸、編碼,或更高層級的通訊協定。 若要建立新的通訊協定繫結項目,一開始要先擴充 BindingElement 類別。 接下來,您必須至少要實作 BindingElement.Clone,且使用 IChannel.GetProperty 實作 ChannelProtectionRequirements
。 這會傳回這個繫結項目的 ChannelProtectionRequirements。 如需詳細資訊,請參閱ChannelProtectionRequirements。
Clone 應該會傳回這個繫結項目的全新複本。 在最佳做法中,我們建議繫結項目作者使用複製建構函式 (其呼叫基底複製建構函式) 來實作 Clone,然後複製在此類別中的任何其他欄位。
傳輸繫結項目
若要建立新的傳輸繫結項目,請擴充 TransportBindingElement 介面。 接下來,您必須至少實作 Clone 方法和 TransportBindingElement.Scheme 屬性。
Clone 應該會傳回這個繫結項目的全新複本。 在最佳做法中,我們建議繫結項目作者使用複製建構函式 (其呼叫基底複製建構函式) 來實作該複製品,然後複製在此類別中的任何其他欄位。
Scheme –Scheme get 屬性會傳回繫結項目所表示之傳輸通訊協定所適用的 URI 結構描述。 例如,System.ServiceModel.Channels.HttpTransportBindingElement 與 System.ServiceModel.Channels.TcpTransportBindingElement 會從其各自的 Scheme 屬性傳回 "http" 與 "net.tcp"。
編碼繫結項目
若要建立新的編碼繫結項目,一開始要先擴充 BindingElement 類別,並實作 System.ServiceModel.Channels.MessageEncodingBindingElement 類別。 接下來,您必須至少實作 Clone、MessageEncodingBindingElement.CreateMessageEncoderFactory 方法和 MessageEncodingBindingElement.MessageVersion 屬性。
Clone. 傳回這個繫結項目的全新複本。 在最佳做法中,我們建議繫結項目作者使用複製建構函式 (其呼叫基底複製建構函式) 來實作 Clone,然後複製在此類別中的任何其他欄位。
CreateMessageEncoderFactory. 傳回 MessageEncoderFactory,它會提供實作新編碼器 (應該會擴充 MessageEncoder) 之實際類別的控制代碼。 如需詳細資訊,請參閱 MessageEncoderFactory 和 MessageEncoder。
MessageVersion. 傳回這個編碼所使用的 MessageVersion,其代表正在使用的 SOAP 和 WS-Addressing 版本。
如需以及使用者定義之編碼繫結項目之選擇性方法和屬性的完整清單,請參閱 MessageEncodingBindingElement。
如需建立新繫結項目的詳細資訊,請參閱建立使用者定義繫結。
當為您的通道建立了繫結項目之後,請回到開發通道主題,看看您是否要在繫結項目中新增組態檔支援、是否要新增中繼資料發行支援及其新增方式,以及是否要建構將使用您繫結項目的使用者定義繫結及其建構方式。