绑定这块引出了很多细节。绑定解决了消息交换中的传输协议,传输,编码等问题。如果要公开WCF服务,就要公开终结点Endpoint,WCF服务信息交换就是Endpoint之间的信息交换。终结点三大元素:ABC。A解决寻址问题,C解决协定(契约)问题,这里可以设置服务的功能集,这是我们真正用到的地方,B绑定是重中之重,解决了其中最重要的一系列问题。
(一)系统提供了全面的绑定实现
系统提供了相当全面的绑定:
·BasicHttpBinding 适用于符合WS-basic profile的web服务通信。例如基于.net的WS。传输协议Http,消息编码:文本/xml。在配置文件里这个节点的名称就是第一个单词全小写,后边单词首字母大写。basicHttpBinding。其它的系统提供的绑定在配置文件中一般也按这个规则走。
·WSHttpBinding 非双工的。
·WSDualHttpBinding 双工的
·NetTcpBinding 跨计算机通信
·NetNamedPipeBinding 计算机内通信
·NetMsmqBinding 消息队列
其它的省略。这里有几个详细的表(这几个表太好):
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs
/wcf_con/html/
(二)绑定基类
绑定在WCF实现上就是上边这些绑定,对应着各自的类。它们都由Binding类派生:
public class BasicHttpBinding : Binding, IBindingRuntimePreferences
Binding类
public abstract class Binding : IDefaultCommunicationTimeouts
Binding类实现了IdefaultCommunicationTimeouts接口,这个接口用于定义通信的超时属性。它有4个属性:
·CloseTimeout 获取 close 方法(由通信对象调用)在超时之前的时间间隔。
·OpenTimeout 获取 open 方法(由通信对象调用)在超时之前的时间间隔。
·ReceiveTimeout 获取 receive 方法(由通信对象调用)在超时之前的时间间隔。
·SendTimeout 获取 send 方法(由通信对象调用)在超时之前的时间间隔。
(三)绑定是分层的
一个绑定对象对应着一组有序的集合,一组绑定元素对象的集合,而这些元素按层来分别处理各自的事务。因为WCF服务是基于消息交换,而这种交换是在终结点之间进行的,所以每个元素负责终结点通信的一个方面。例如:编码,传输,安全等等。
它的层:
层 |
选项 |
是否必需 |
事务流 |
TransactionFlowBindingElement |
否 |
可靠性 |
ReliableSessionBindingElement |
否 |
安全性 |
对称、非对称、传输级 |
否 |
形状更改 |
CompositeDuplexBindingElement |
否 |
传输升级 |
SSL 流、Windows 流、对等解析程序 |
否 |
编码 |
文本、二进制、MTOM、自定义 |
是 |
传输 |
TCP、命名管道、HTTP、HTTPS、MSMQ、自定义 |
是 |
其中编码层和传输层是必要条件。
这一层一层的绑定元素(Binding Element)就是BindingElement
(四)绑定元素
绑定元素在WCF实现上就是BindingElement
它做为其它绑定元素的基类。绑定元素用于为各种类型的信道生成信道工厂和信道监听器以处理传出和传入消息的绑定元素。(有的叫通道,也有叫信道的,指得是一个意思,但理解上有一些不同。)
由它派生的绑定元素实现:
OneWayBindingElement
TransportBindingElement
CompositeDuplexBindingElement
StreamUpgradeBindingElement
PrivacyNoticeBindingElement
UseManagedPresentationBindingElement
ReliableSessionBindingElement
SecurityBindingElement
MessageEncodingBindingElement
PeerResolverBindingElement
TransactionFlowBindingElement
ContextBindingElement
从字面上可以大概能够看出每个元素的主要义务。
(五)绑定的绑定元素
这里看下几种系统绑定是由哪几个绑定元素组成的。
在绑定基类中Binding有个CreateBindingElements方法,
public abstract BindingElementCollection CreateBindingElements()
它的功能就是:创建一个集合,该集合包含属于当前绑定的绑定元素,而由绑定基类实现的各个系统绑定都实现了这个方法。然后绑定元素(BindingElement)有个GetType方法,用于获取绑定元素实例(Type),然后就可以通过类型属性来得到详细信息了。
(1)现在看看BasicHttpBinding绑定包含哪些绑定元素:
public void TestBasicHttpBindingElements()
{
BasicHttpBinding _binding=new BasicHttpBinding();
BindingElementCollection _list =
_binding.CreateBindingElements();
foreach (BindingElement ele in _list)
{
Console.WriteLine(ele.GetType().FullName);
}
}
结果:
System.ServiceModel.Channels.TextMessageEncodingBindingElement
System.ServiceModel.Channels.HttpTransportBindingElement
它由2层组成。从字面上可以大概推断出一层用于消息编码,一层用于传输。绑定是分层的,最低要有两层:传输层与编码层。
·TextMessageEncodingBindingElement这个绑定元素的结构为:
BindingElement
MessageEncodingBindingElement
TextMessageEncodingBindingElement
它的定义为:
public sealed class TextMessageEncodingBindingElement
: MessageEncodingBindingElement,
IWsdlExportExtension, IPolicyExportExtension
·HttpTransportBindingElement这个绑定元素的结构为:
BindingElement
TransportBindingElement
HttpTransportBindingElement
它的定义为:
public class HttpTransportBindingElement
: TransportBindingElement,
IWsdlExportExtension, IPolicyExportExtension
(2)WSDualHttpBinding绑定元素
public void TestWSDuplexHttpBindingElements()
{
WSDualHttpBinding _binding = new WSDualHttpBinding();
BindingElementCollection _list =
_binding.CreateBindingElements();
foreach (BindingElement ele in _list)
{
Console.WriteLine(ele.GetType().FullName);
}
}
结果:
System.ServiceModel.Channels.TransactionFlowBindingElement
System.ServiceModel.Channels.ReliableSessionBindingElement
System.ServiceModel.Channels.SymmetricSecurityBindingElement
System.ServiceModel.Channels.CompositeDuplexBindingElement
System.ServiceModel.Channels.OneWayBindingElement
System.ServiceModel.Channels.TextMessageEncodingBindingElement
System.ServiceModel.Channels.HttpTransportBindingElement