创建 BindingElement

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

概述

为通道创建 BindingElement,使开发人员能够在 WCF 应用程序中使用该通道。 可以从 System.ServiceModel.ServiceHost 类中使用 BindingElement 对象,以便将 WCF 应用程序连接到通道,而不必获取该通道的精确类型信息。

创建了 BindingElement 以后,可以根据需要执行开发通道中所述的其余通道开发步骤,以启用更多的功能。

添加绑定元素

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

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 并使用 IChannel.GetProperty 实现 ChannelProtectionRequirements。 这会返回此绑定元素的 ChannelProtectionRequirements。 有关详细信息,请参阅 ChannelProtectionRequirements

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

传输绑定元素

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

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

SchemeScheme 获取属性返回由该绑定元素表示的传输协议的 URI 方案。 例如,System.ServiceModel.Channels.HttpTransportBindingElementSystem.ServiceModel.Channels.TcpTransportBindingElement 返回其各自 Scheme 属性中的“http”和“net.tcp”。

编码绑定元素

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

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

有关创建新的绑定元素的详细信息,请参阅创建用户定义的绑定

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

另请参阅