创建用户定义的绑定

可通过多种方式创建系统未提供的绑定:

  • 基于 CustomBinding 类创建自定义绑定,该类是填充绑定元素的容器。 然后,自定义绑定将添加到服务终结点。 可以通过编程方式或在应用程序配置文件中创建自定义绑定。 若要使用应用程序配置文件中的绑定元素,绑定元素必须扩展 BindingElementExtensionElement。 有关自定义绑定的详细信息,请参阅 自定义绑定CustomBinding

  • 可以创建派生自标准绑定的类。 例如,可以从 WSHttpBinding 派生一个类,并重写 CreateBindingElements 方法,以获取绑定元素,插入自定义绑定元素,或为安全性确立特定值。

  • 可以创建一个新 Binding 类型来完全控制整个绑定实现。

绑定元素的顺序

每个绑定元素表示发送或接收消息时的处理步骤。 在运行时,绑定元素创建生成传出和传入通道堆栈所需的通道和侦听器。

绑定元素有三种主要类型:协议绑定元素、编码绑定元素和传输绑定元素。

协议绑定元素 – 这些元素表示对消息执行更高级别的处理步骤。 这些绑定元素创建的通道和侦听器可以添加、删除或修改消息内容。 给定绑定可能具有任意数量的协议绑定元素,每个元素都继承自 BindingElement。 Windows Communication Foundation (WCF) 包括多个协议绑定元素,包括 ReliableSessionBindingElementSymmetricSecurityBindingElement.

编码绑定元素 – 这些元素表示消息与准备好在网络上传输的编码之间的转换。 典型的 WCF 绑定仅包含一个编码绑定元素。 编码绑定元素的示例包括 MtomMessageEncodingBindingElementBinaryMessageEncodingBindingElementTextMessageEncodingBindingElement。 如果未为绑定指定编码绑定元素,则使用默认编码。 当传输为 HTTP 时,默认值为文本;其他情况下,默认值为二进制。

传输绑定元素 – 这些元素表示传输协议上的编码消息的传输。 典型的 WCF 绑定恰好包含一个传输绑定元素,该元素从 TransportBindingElement 继承。 传输绑定元素的示例包括TcpTransportBindingElementHttpTransportBindingElementNamedPipeTransportBindingElement

创建新绑定时,添加的绑定元素的顺序非常重要。 始终按以下顺序添加绑定元素:

选项 必选
事务流 System.ServiceModel.Channels.TransactionFlowBindingElement
可靠性 System.ServiceModel.Channels.ReliableSessionBindingElement
安全 System.ServiceModel.Channels.SecurityBindingElement
复合双工 System.ServiceModel.Channels.CompositeDuplexBindingElement
编码 文本、二进制、MTOM、自定义 是*
运输 TCP、命名管道、HTTP、HTTPS、MSMQ、自定义 是的

*由于每个绑定都需要编码,因此如果未指定编码,WCF 会为你添加默认编码。 默认值为 HTTP 和 HTTPS 传输的文本/XML 格式,否则为二进制格式。

创建新的绑定元素

除了 WCF 提供的派生 BindingElement 类型之外,还可以创建自己的绑定元素。 这样,您就可以通过创建自己的、可与堆栈中其他的系统提供的类型组合的 BindingElement,自定义创建绑定堆栈的方式和进入其中的组件。

例如,如果实现提供 LoggingBindingElement 将消息记录到数据库的功能,则必须将其放置在通道堆栈中的传输通道上方。 在这种情况下,应用程序创建了一个自定义绑定,它将LoggingBindingElementTcpTransportBindingElement组合在一起,如以下示例所示。

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

编写新绑定元素的方式取决于其确切功能。 其中一个示例 :传输:UDP 提供了有关如何实现一种绑定元素的详细说明。

创建新的绑定

用户创建的绑定元素可通过两种方式使用。 上一部分演示了第一种方法:通过自定义绑定。 自定义绑定允许用户基于任意绑定元素集(包括用户创建的元素)创建自己的绑定。

如果在多个应用程序中使用绑定,请创建自己的绑定并对其进行扩展Binding。 这可避免每次想使用自定义绑定时都需要手动创建。 用户定义的绑定允许定义绑定的行为,并包括用户定义的绑定元素。 它是 预打包的:每次使用绑定时都不必重新生成绑定。

用户定义绑定必须至少实现 CreateBindingElements 该方法和 Scheme 属性。

CreateBindingElements 方法返回一个新的 BindingElementCollection,其中包含绑定的绑定元素。 集合是有序的,应首先包含协议绑定元素,后跟编码绑定元素,后跟传输绑定元素。 使用 WCF 系统提供的绑定元素时,必须遵循 自定义绑定中指定的绑定元素排序规则。 此集合不得引用在用户定义的绑定类中引用的对象;因此,绑定作者必须在每次调用 Clone() 时返回 BindingElementCollectionCreateBindingElements

Scheme 属性表示绑定上使用的传输协议的 URI 方案。 例如, WSHttpBindingNetTcpBinding 从各自的 Scheme 属性返回“http”和“net.tcp”。

有关用户定义的绑定的可选方法和属性的完整列表,请参阅 Binding

示例:

此示例在SampleProfileUdpBinding中实现了配置文件绑定,SampleProfileUdpBinding派生自。 SampleProfileUdpBinding 包含最多四个绑定元素:一个用户创建的元素 UdpTransportBindingElement,以及三个系统提供的元素:TextMessageEncodingBindingElementCompositeDuplexBindingElementReliableSessionBindingElement

public override BindingElementCollection CreateBindingElements()  
{
    BindingElementCollection bindingElements = new BindingElementCollection();  
    if (ReliableSessionEnabled)  
    {  
        bindingElements.Add(session);  
        bindingElements.Add(compositeDuplex);  
    }  
    bindingElements.Add(encoding);  
    bindingElements.Add(transport);  
    return bindingElements.Clone();  
}  

双工协定的安全限制

并非所有绑定元素都彼此兼容。 具体而言,安全绑定元素在用于双工协定时存在一些限制。

单步安全

可以通过将消息negotiateServiceCredential配置元素的属性<设置为>false,实现“一次性”安全性,其中所有必需的安全凭据都会在单个消息中发送。

单步身份验证无法与双工协定一起工作。

对于 Request-Reply 协定,仅当安全绑定元素下面的绑定堆栈支持创建 IRequestChannelIRequestSessionChannel 实例时,一次性身份验证才有效。

对于单向协定,如果安全绑定元素下面的绑定堆栈支持创建IRequestChannelIRequestSessionChannelIOutputChannelIOutputSessionChannel实例,则一次性身份验证有效。

Cookie 模式安全上下文标记不能与双工协定一起使用。

对于 Request-Reply 协定,仅当安全绑定元素下面的绑定堆栈支持创建 IRequestChannelIRequestSessionChannel 实例时,Cookie 模式安全上下文令牌才有效。

对于单向协定,如果安全绑定元素下面的绑定堆栈支持创建 IRequestChannelIRequestSessionChannel 实例,则 Cookie 模式安全上下文令牌有效。

会话模式安全上下文令牌

如果安全绑定元素下的绑定堆栈支持创建 IDuplexChannelIDuplexSessionChannel 实例,则会话模式 SCT 适用于双工协定。

如果安全绑定元素下面的绑定堆栈支持创建IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel实例,则会话模式 SCT 适用于 Request-Reply 协定。

如果安全绑定元素下面的绑定堆栈支持创建IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel实例,则会话模式 SCT 适用于 1 向协定。

派生自标准绑定

与其创建全新的绑定类,不如扩展系统现有提供的绑定之一。 与上一个示例非常类似,必须重写 CreateBindingElements 方法和 Scheme 属性。

另请参阅