我们常说的WCF里面有ABC,那么B代表的就是Binding。那首先来大致了解一下什么是Binding。
Extending WCF(三)—Extending Bindings
从图上可以看出,Binding为WCF运行时建立了Channel Stack,定义了消息在传输过程中比较重要的三件事:传输、编码、协议(包括安全性、可靠性等)。其中传输和编码是必须要提供的。
从我们开发者的角度来说,Binding就是一个Binding Element的集合。Binding Element就是指的protocols、encoding、transport。微软已经给我们提供了非常多的Binding Element。那么是不是Binding就是简单将各种Element放到一起就行了呢?答案是否定的,因为在Channel Stack中还要有一定的顺序:
Extending WCF(三)—Extending Bindings
在Stack中,由下至上的顺序是不能改变的。先加入的Element会放到最上面。其中Transport和Encoding是每个Binding所必须的。
了解了这一点接下来就简单了,为什么WCF提供了这么多的Binding呢?像什么BasicHttpBinding、NetTcpBinding、WSHttpBinding等等。原因就是往Channel Stack中放入了不同的Binding Element,所以组合出来这么多Binding。是不是有点像搭积木?
那我们要扩展Binding就比较方便了,不用什么新的东西,只需要用WCF已有的Binding Element来组合一下就可以了。WCF已经为我们想到了这一点,所以最简单的扩展Binding的方法就是在配置文件里面写一写就行了。

Extending WCF(三)—Extending Bindings  <system.serviceModel>
Extending WCF(三)—Extending Bindings    
<services>
Extending WCF(三)—Extending Bindings      
<service name="MyContract" behaviorConfiguration="MEX Enabled">
Extending WCF(三)—Extending Bindings        
<endpoint address="http://localhost:8888/MyContract"
Extending WCF(三)—Extending Bindings                  binding
="customBinding"
Extending WCF(三)—Extending Bindings                  bindingConfiguration
="myBasicHttpBinding"
Extending WCF(三)—Extending Bindings                  contract
="IMyContract"
Extending WCF(三)—Extending Bindings                  
/>
Extending WCF(三)—Extending Bindings      
</service>
Extending WCF(三)—Extending Bindings    
</services>
Extending WCF(三)—Extending Bindings    
<behaviors>
Extending WCF(三)—Extending Bindings      
<serviceBehaviors>
Extending WCF(三)—Extending Bindings        
<behavior name="MEX Enabled">
Extending WCF(三)—Extending Bindings          
<serviceMetadata httpGetEnabled="true"/>
Extending WCF(三)—Extending Bindings        
</behavior>
Extending WCF(三)—Extending Bindings      
</serviceBehaviors>
Extending WCF(三)—Extending Bindings    
</behaviors>
Extending WCF(三)—Extending Bindings    
<bindings>
Extending WCF(三)—Extending Bindings      
<customBinding>
Extending WCF(三)—Extending Bindings        
<binding name="myBasicHttpBinding">
Extending WCF(三)—Extending Bindings          
<!-- Add Binding Element here -->
Extending WCF(三)—Extending Bindings          
<reliableSession ordered="true"/>
Extending WCF(三)—Extending Bindings          
<mtomMessageEncoding />
Extending WCF(三)—Extending Bindings          
<httpTransport />
Extending WCF(三)—Extending Bindings        
</binding>
Extending WCF(三)—Extending Bindings      
</customBinding>
Extending WCF(三)—Extending Bindings    
</bindings>
Extending WCF(三)—Extending Bindings  
</system.serviceModel>

使用的Binding呢是CustomBinding,这个Binding是WCF提供给用户客制化的,我们可以往里面随便添加需要用到的Binding Element。
大部分的情况像这样来扩展已经足够了,当然,如果你还觉得不够的话,自己开发一个Binding也是没有问题的。
首先需要写一个Binding的类,比如像下面这样:
Extending WCF(三)—Extending Bindingspublic class MyBinding : Binding
}
所有的Binding类呢都是继承于Binding这个基类的,我们需要重写一个方法CreateBindingElements(),这个方法就是把你所需要的Binding Element放进去。这样就可以了,我们在代码中就可以这样用这个Binding了。
Extending WCF(三)—Extending Bindingshost.AddServiceEndpoint(typeof(IMyContract), new MyBinding(), "http://localhost:8888/MyContract");
不过可能这样你会觉得很不爽,不够灵活。当然我们也可以在配置文件中来进行配置,不过呢还需要添加两个类。
Extending WCF(三)—Extending Bindingspublic class MyBindingElement : StandardBindingElement
}
MyBindingElement继承于StandardBindingElement类,主要用来就是说定义了在Binding配置结点中可以配置的元素。MyBindingSection用来在WCF配置文件中注册一个新的Binding类型。所以我们的配置文件可以这么写:
Extending WCF(三)—Extending Bindings  <system.serviceModel>
Extending WCF(三)—Extending Bindings    
<extensions>
Extending WCF(三)—Extending Bindings      
<bindingElementExtensions>
Extending WCF(三)—Extending Bindings        
<add name="myBindingElement" type="ServiceExt.MyBindingElement, ServiceExt"/>
Extending WCF(三)—Extending Bindings      
</bindingElementExtensions>
Extending WCF(三)—Extending Bindings      
<bindingExtensions>
Extending WCF(三)—Extending Bindings        
<add name="myBinding" type="ServiceExt.MyBindingSection, ServiceExt"/>
Extending WCF(三)—Extending Bindings      
</bindingExtensions>
Extending WCF(三)—Extending Bindings    
</extensions>
Extending WCF(三)—Extending Bindings    
<services>
Extending WCF(三)—Extending Bindings      
<service name="MyContract" behaviorConfiguration="MEX Enabled">
Extending WCF(三)—Extending Bindings        
<endpoint address="http://localhost:8888/MyContract"
Extending WCF(三)—Extending Bindings                  binding
="myBinding"
Extending WCF(三)—Extending Bindings                  bindingConfiguration
="myBindingElement"
Extending WCF(三)—Extending Bindings                  contract
="IMyContract"
Extending WCF(三)—Extending Bindings                  
/>
Extending WCF(三)—Extending Bindings      
</service>
Extending WCF(三)—Extending Bindings    
</services>
Extending WCF(三)—Extending Bindings    
<behaviors>
Extending WCF(三)—Extending Bindings      
<serviceBehaviors>
Extending WCF(三)—Extending Bindings        
<behavior name="MEX Enabled">
Extending WCF(三)—Extending Bindings          
<serviceMetadata httpGetEnabled="true"/>
Extending WCF(三)—Extending Bindings        
</behavior>
Extending WCF(三)—Extending Bindings      
</serviceBehaviors>
Extending WCF(三)—Extending Bindings    
</behaviors>
Extending WCF(三)—Extending Bindings    
<bindings>
Extending WCF(三)—Extending Bindings      
<myBinding>
Extending WCF(三)—Extending Bindings        
<binding name="myBindingElement" />
Extending WCF(三)—Extending Bindings      
</myBinding>
Extending WCF(三)—Extending Bindings    
</bindings>
Extending WCF(三)—Extending Bindings  
</system.serviceModel>
注意到我们需要在extensions结点中注册我们新加的binding。
至此,我们新开发的Binding就可以正常使用了,当然这个新的Binding没有加入任何东西,至于如何用它,那就看你的应用程序的需求了。

相关文章: