可通过多种方式创建系统未提供的绑定:
基于 CustomBinding 类创建自定义绑定,该类是填充绑定元素的容器。 然后,自定义绑定将添加到服务终结点。 可以通过编程方式或在应用程序配置文件中创建自定义绑定。 若要使用应用程序配置文件中的绑定元素,绑定元素必须扩展 BindingElementExtensionElement。 有关自定义绑定的详细信息,请参阅 自定义绑定 和 CustomBinding。
可以创建派生自标准绑定的类。 例如,可以从 WSHttpBinding 派生一个类,并重写 CreateBindingElements 方法,以获取绑定元素,插入自定义绑定元素,或为安全性确立特定值。
可以创建一个新 Binding 类型来完全控制整个绑定实现。
绑定元素的顺序
每个绑定元素表示发送或接收消息时的处理步骤。 在运行时,绑定元素创建生成传出和传入通道堆栈所需的通道和侦听器。
绑定元素有三种主要类型:协议绑定元素、编码绑定元素和传输绑定元素。
协议绑定元素 – 这些元素表示对消息执行更高级别的处理步骤。 这些绑定元素创建的通道和侦听器可以添加、删除或修改消息内容。 给定绑定可能具有任意数量的协议绑定元素,每个元素都继承自 BindingElement。 Windows Communication Foundation (WCF) 包括多个协议绑定元素,包括 ReliableSessionBindingElement 和 SymmetricSecurityBindingElement.
编码绑定元素 – 这些元素表示消息与准备好在网络上传输的编码之间的转换。 典型的 WCF 绑定仅包含一个编码绑定元素。 编码绑定元素的示例包括 MtomMessageEncodingBindingElement、BinaryMessageEncodingBindingElement 和 TextMessageEncodingBindingElement。 如果未为绑定指定编码绑定元素,则使用默认编码。 当传输为 HTTP 时,默认值为文本;其他情况下,默认值为二进制。
传输绑定元素 – 这些元素表示传输协议上的编码消息的传输。 典型的 WCF 绑定恰好包含一个传输绑定元素,该元素从 TransportBindingElement 继承。 传输绑定元素的示例包括TcpTransportBindingElement、HttpTransportBindingElement和NamedPipeTransportBindingElement。
创建新绑定时,添加的绑定元素的顺序非常重要。 始终按以下顺序添加绑定元素:
层 | 选项 | 必选 |
---|---|---|
事务流 | 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
将消息记录到数据库的功能,则必须将其放置在通道堆栈中的传输通道上方。 在这种情况下,应用程序创建了一个自定义绑定,它将LoggingBindingElement
与TcpTransportBindingElement
组合在一起,如以下示例所示。
Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);
编写新绑定元素的方式取决于其确切功能。 其中一个示例 :传输:UDP 提供了有关如何实现一种绑定元素的详细说明。
创建新的绑定
用户创建的绑定元素可通过两种方式使用。 上一部分演示了第一种方法:通过自定义绑定。 自定义绑定允许用户基于任意绑定元素集(包括用户创建的元素)创建自己的绑定。
如果在多个应用程序中使用绑定,请创建自己的绑定并对其进行扩展Binding。 这可避免每次想使用自定义绑定时都需要手动创建。 用户定义的绑定允许定义绑定的行为,并包括用户定义的绑定元素。 它是 预打包的:每次使用绑定时都不必重新生成绑定。
用户定义绑定必须至少实现 CreateBindingElements 该方法和 Scheme 属性。
CreateBindingElements 方法返回一个新的 BindingElementCollection,其中包含绑定的绑定元素。 集合是有序的,应首先包含协议绑定元素,后跟编码绑定元素,后跟传输绑定元素。 使用 WCF 系统提供的绑定元素时,必须遵循 自定义绑定中指定的绑定元素排序规则。 此集合不得引用在用户定义的绑定类中引用的对象;因此,绑定作者必须在每次调用 Clone()
时返回 BindingElementCollection 的 CreateBindingElements。
该 Scheme 属性表示绑定上使用的传输协议的 URI 方案。 例如, WSHttpBinding 和 NetTcpBinding 从各自的 Scheme 属性返回“http”和“net.tcp”。
有关用户定义的绑定的可选方法和属性的完整列表,请参阅 Binding。
示例:
此示例在SampleProfileUdpBinding
中实现了配置文件绑定,SampleProfileUdpBinding
派生自。
SampleProfileUdpBinding
包含最多四个绑定元素:一个用户创建的元素 UdpTransportBindingElement
,以及三个系统提供的元素:TextMessageEncodingBindingElement
,CompositeDuplexBindingElement
和 ReliableSessionBindingElement
。
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 协定,仅当安全绑定元素下面的绑定堆栈支持创建 IRequestChannel 或 IRequestSessionChannel 实例时,一次性身份验证才有效。
对于单向协定,如果安全绑定元素下面的绑定堆栈支持创建IRequestChannel、IRequestSessionChannel、IOutputChannel或IOutputSessionChannel实例,则一次性身份验证有效。
Cookie 模式安全上下文标记
Cookie 模式安全上下文标记不能与双工协定一起使用。
对于 Request-Reply 协定,仅当安全绑定元素下面的绑定堆栈支持创建 IRequestChannel 或 IRequestSessionChannel 实例时,Cookie 模式安全上下文令牌才有效。
对于单向协定,如果安全绑定元素下面的绑定堆栈支持创建 IRequestChannel 或 IRequestSessionChannel 实例,则 Cookie 模式安全上下文令牌有效。
会话模式安全上下文令牌
如果安全绑定元素下的绑定堆栈支持创建 IDuplexChannel 或 IDuplexSessionChannel 实例,则会话模式 SCT 适用于双工协定。
如果安全绑定元素下面的绑定堆栈支持创建IDuplexChannel、IDuplexSessionChannelIRequestChannel或IRequestSessionChannel实例,则会话模式 SCT 适用于 Request-Reply 协定。
如果安全绑定元素下面的绑定堆栈支持创建IDuplexChannel、IDuplexSessionChannelIRequestChannel或IRequestSessionChannel实例,则会话模式 SCT 适用于 1 向协定。
派生自标准绑定
与其创建全新的绑定类,不如扩展系统现有提供的绑定之一。 与上一个示例非常类似,必须重写 CreateBindingElements 方法和 Scheme 属性。