创建 BindingElement

绑定和绑定元素(分别扩展 System.ServiceModel.Channels.BindingSystem.ServiceModel.Channels.BindingElement 的对象)是 Windows Communication Foundation (WCF) 应用程序模型与通道工厂和通道侦听器相关联的位置。 如果没有绑定,使用自定义通道需要在通道级别进行编程,如 服务 Channel-Level 编程客户端 Channel-Level 编程中所述。 本主题讨论在 WCF 中使用通道、为通道开发 BindingElement 以及在开发通道的步骤 4 中所述的应用程序中使用通道的最低要求。

概述

为您的频道创建BindingElement,可以使开发人员在 WCF 应用程序中使用它。 BindingElement 对象可用于从 System.ServiceModel.ServiceHost 类将 WCF 应用程序连接到通道,而无需获取通道的精确类型信息。

创建一个 BindingElement 通道后,可以按照 开发频道中所述的剩余频道开发步骤,根据要求启用更多功能。

添加绑定元素

若要实现自定义 BindingElement,请编写继承自 BindingElement的类。 例如,如果您已开发了一个可以将大消息拆分为多个块并在另一端重新组合这些块的 ChunkingChannel,则可以在任意绑定中使用此通道,方法是实现一个 BindingElement 并将绑定配置为使用此元素。 本主题的其余部分使用 ChunkingChannel 此示例来演示实现绑定元素的要求。

A ChunkingBindingElement 负责创建 ChunkingChannelFactoryChunkingChannelListener。 它重写 CanBuildChannelFactoryCanBuildChannelListener 实现,并检查类型参数是否为 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 并使用 ChannelProtectionRequirements 实现 IChannel.GetProperty。 这会返回此绑定元素的 ChannelProtectionRequirements。 有关详细信息,请参阅 ChannelProtectionRequirements

Clone 应返回此绑定元素的新副本。 作为一种最佳做法,我们建议绑定元素作者实现 Clone,方法是使用复制构造函数首先调用基复制构造函数,然后克隆此类中的所有附加字段。

传输绑定元素

若要创建新的传输绑定元素,请扩展TransportBindingElement接口。 然后,必须至少实现 Clone 方法和 TransportBindingElement.Scheme 属性。

Clone – 应返回此绑定元素的新副本。 作为一种最佳做法,我们建议绑定元素作者实现 Clone,方法是使用可调用基复制构造函数的复制构造函数,然后克隆此类中的任何其他字段。

Scheme Scheme– get 属性返回绑定元素表示的传输协议的 URI 方案。 例如,System.ServiceModel.Channels.HttpTransportBindingElementSystem.ServiceModel.Channels.TcpTransportBindingElement从各自的Scheme属性返回“http”和“net.tcp”。

编码绑定元素

若要创建新的编码绑定元素,请首先扩展 BindingElement 类并实现 System.ServiceModel.Channels.MessageEncodingBindingElement 类。 然后,必须至少实现 CloneMessageEncodingBindingElement.CreateMessageEncoderFactory 方法和 MessageEncodingBindingElement.MessageVersion 属性。

有关用户定义的编码绑定元素的可选方法和属性的完整列表,请参阅 MessageEncodingBindingElement

有关创建新绑定元素的详细信息,请参阅 “创建 User-Defined 绑定”。

为通道创建绑定元素后,返回到 “开发通道” 主题,查看是否要将配置文件支持添加到绑定元素、是否以及如何添加元数据发布支持,以及是否以及如何构造使用绑定元素的用户定义绑定。

另请参阅