有很多时候预先设置好的绑定不满足你的服务的需求。一般的场景包含了自定义安全和额外传输协议,都不被WCF支持。一个例子是WCF中不支持UDP协议。对UDP协议的支持是以Windows SDK 中的例子来实现的。考虑到这些情况所以WCF提供了创建自定义绑定的能力。自定义绑定可以由代码或配置文件创建。一个自定义绑定的代码使用System.ServiceModel.Channels命名空间中的CustomBinding 类来生成。这个类暴露了一个你可以添加绑定元素的绑定元素集合。这允许你构造一个基于一系列现有绑定元素的新的绑定。列表4.32 显示了一个由代码生成的自定义绑定。
列表4.32 使用代码创建一个自定义绑定
CustomBinding customBinding = new CustomBinding();
customBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
customBinding.Elements.Add(new UdpBindingElement());
一个自定义绑定可以使用customBinding元素在配置文件中创建。列表4.33 显示了一个用配置文件描述的自定义绑定。当使用配置文件时,一个自定义绑定必须总是使用一个命名绑定。
列表4.33 使用配置文件创建一个自定义绑定
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="CustomBinding">
<binaryMessageEncoding />
<udpTransport />
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
注意绑定确定了一个传输绑定元素和一个编码器。这是创建一个自定义绑定需要的所有内容。如果传输绑定元素确定了一个默认编码器,那么编码器就是可选的。改变一个自定义绑定是如何工作的只是几行代码或者配置文件的问题。当使用配置文件的时候要小心,因为它可以被改变。如果你不打算在以后改变绑定,那么使用代码创建你的自定义绑定。
下面的配置文件内容可以与列表4.2~4.4中的示例程序一起使用。列表4.34中的配置文件信息使用customBinding绑定暴露StockQuoteService服务。绑定在TCP传输协议与二进制编码的基础上暴露服务。自定义绑定与netTcpBinding绑定类似但是不支持可信赖消息,事务和安全。
列表 4.34 customBinding 宿主配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="EssentialWCF.StockQuoteService">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost/stockquoteservice"/>
</baseAddresses>
</host>
<endpoint address=""
binding="customBinding" bindingConfiguration="customBinding"
contract="EssentialWCF.IStockQuoteService" />
</service>
</services>
<bindings>
<customBinding>
<binding name="customBinding">
<binaryMessageEncoding/>
<tcpTransport />
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
列表4.35 调用列表4.34中使用customBinding绑定的服务的客户端配置
列表4.35 customBinding 客户端配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost/stockquoteservice"
binding="customBinding" bindingConfiguration="customBinding"
contract="EssentialWCF.IStockQuoteService" />
</client>
<bindings>
<customBinding>
<binding name="customBinding">
<binaryMessageEncoding/>
<tcpTransport />
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
用户定义绑定
绑定可以完全使用代码或配置文件定义或者它们可以通过继承自Binding类来创建。这种类型的绑定被称为用户定义绑定。你仍然需要为你的绑定确定绑定元素。
一个自定义绑定和一个用户定义绑定间的基本不同是用户定义绑定是一个类的特殊实例,它执行了你创建一个绑定时的所有操作。如果你打算在很多应用中重用你的绑定那么它是首选。如果你选择使用这个途径,作者强烈建议用户定义绑定支持使用一个绑定扩展创建的能力。一个绑定扩展通过配置文件暴露一个绑定类。创建一个新类通过继承System.ServiceModel.Configuration命名空间里的BindingElementExtensionElement类实现。
提示 为你的自定义绑定提供一个绑定扩展
严肃的考虑一下使用一个绑定扩展而不是<customBinding>配置元素来暴露你的自定义绑定。这将有助于帮助避免配置文件中的错误以及相关错误。