3、信道监听器。
1)、IChannelListener与ChannelListenerBase:
信道监听器实现接口System.ServiceModel.Channels.IChannelListener,而IChannelListener继承自ICommunicationObject接口,WaitForChannel和BeginWaitForChannel/EndWaitForChannel方法用于检测信道(栈)创建/获取的可行性。就是自己测试测试创建一个新信道或者获取一个现有信道是否成功,Uri返回真正的监听地址:
public interface IChannelListener:ICommunicationObject
{
bool WaitForChannel(TimeSpan timeout);
....
Uri uri{get;}
}
还有一个泛型接口,IChannelListener<TChannel> 用于监听某种信道形状的信道,AcceptChannel和BeginAcceptChannel/EndAcceptChannel用户获取或创建用于接收处理消息的信道栈。
除了这两个接口,还有两个继承自这个接口的抽象类,分别是ChannelListenerBase和ChannelListenerBase<TChannel>。
2)、信道栈的创建/使用模式
信道监听器一旦探测到抵达的请求,就会用创建的信道栈对请求消息进行处理,分为两种模式:
a、数据报信道监听器:信道监听器开始监听的时候,就会调用AcceptChannel方法创建信道,事先创建好,用于所有用户请求消息的处理。
b、会话信道监听器:由于会话信道是一对一的监听,所以,不会创建一个共享信道,信道监听器会在第一次收到客户端请求的时候调用AcceptChannel方法创建处理消息的信道。
4、信道工厂
信道工厂是信道管理器在客户端的别名,作用就是创建用于发送请求和接收回复的信道,比服务端简单多了。
1)、IChannelFactory与ChannelFactoryBase
信道工厂实现接口IChannelFactory和IChannelFactory<IChannel> 和信道监听器对应,CreateChannel方法用于创建信道。ChannelFactoryBase继承IChannelFactory接口。
5、绑定元素。
客户端和服务端分别通过信道工厂和信道监听器创建信道,信道工厂和信道监听器从何而来呢,是由绑定元素创建的,绑定元素就是构成绑定的元素。
1)、构成绑定的元素:
绑定元素就是构成绑定对象的元素,绑定对象是由若干个绑定元素按照一定组合方式构成绑定对象。而信道栈是由绑定对象创建的,这样,绑定元素的不同组合方式就可以组成不同的绑定对象,从而不同的绑定对象创建用于不同用途的信道栈,WCF这样把绑定和绑定元素分开,可以很灵活的设计出自己需要的信道栈。
绑定元素最基本的作用就是实现对信道监听器和信道工厂的创建,BindingElement定义如下:
public abstract class BindingElement
{
protected BindingElement(BindingElement elementToBeCloned);
public virtual IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context);
public virtual IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context) where TChannel :class,IChannel;
...
}
最基本的方法:BuildChannelFactory和BuildChannelListener方法,分别创建信道工厂和信道监听器。
6、绑定。
定义:绑定是绑定元素的有序集合。
1)、绑定是绑定元素的有序集合:
不同绑定元素具有不同的特性,当判断某种绑定类型是否支持某种特性的时候,就要看组成该绑定类型的绑定元素是否有具有此特性。
WCF 中所有绑定直接或间接的继承自System.ServiceModel.Channels.Binding抽象类,Binding类型实现了很多接口,具体如下:
public abstract class Binding:IDefaultCommunicationTimeouts
{
[DefaultValue (Typeof(TimeSpane),"00:01:00"]
public TimeSpan CloseTimeout{get;set;}
[DefaultValue (Typeof(TimeSpane),"00:01:00"]
public TimeSpan OpenTimeout{get;set;}
[DefaultValue (Typeof(TimeSpane),"00:10:00"]
public TimeSpan ReceiveTimeout{get;set;}
[DefaultValue (Typeof(TimeSpane),"00:01:00"]
public TimeSpan CloseTimeout{get;set;}
}
这个是超时接口,除了接收超时默认是10分钟外,其他默认超时是1分钟。
此外Binding类还创建了信道工厂和信道管理器的类,如下:
public abstract class Binding:IDefaultCommunicationTimeouts
{
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(params object[] parameters);
public virtual IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingParameterCollection parameters);
public virtual IChannelListener<TChannel> BuildChannelListener<TChannel>(params object[] parameters) where TChannel:Class,IChannel;
public virtual IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingParameterCollection parameters) where TChannel:class,IChannel;
}
binding最为重要的方法就是如何构建组成该绑定对象的所有元素的集合:pulic abstract BindingElementCollection CreateBindingElements();
具体Binding类调用BuildChannelFactory方法和BuildChannelListener方法如何创建信道工厂和信道监听器的呢,具体是通过BindContext类实现的,BindContext绑定上下文中Binding属性代表绑定上下文的绑定对象,只读属性RemainingBindingElments代表绑定元素集合中包含了Binding的所有绑定元素。
public class BindingContext
{
public IChannelFactory<TChannel> BuildInnerChannelFactory<TChannel>();//创建下一个信道工厂
public IChannelListener<TChannel> BuildInnerChannelListener<TChannel>();//创建下一个信道监听器
public CustomBinding Binding{get;}//绑定对象
public BindingParameterCollection BindingParameters{get;}
public BindingElementCollection RemainingBindingElements{get;}//所有绑定元素的集合
}
信道监听器和信道工厂创建原理:BindingContext 的RemainingBindingElements在“创建的时候”,反映了相应绑定对象所有的绑定元素,这个集合是个动态的,调用BuildInnerChannelListener<TChannel>方法的时候,会获取RemainingBindingElements属性集合的第一个绑定元素并调用它的BuildChannelListener<TChannel>方法,与此同时,第一个绑定元素会从集合中移除,绑定元素会将此BandingContext作为参数调用BuildChannelListener<TChannel>方法创建相应的信道监听器,而信道监听器的创建的过程又会调用BindingContext的BuildChannelListener<TChannel>方法得到下一个信道监听器,这时候,集合中第二个元素会被调用,依次类推的方式,创建了整个信道监听器的组成了一个管道,信道工厂和信道监听器的创建过程完全一致。
3)、系统绑定:
a、系统绑定预览:WCF预定了一系列的系统绑定,比如:BasicHttpBinding,WSHttpBinding,WS2007HttpBinding,WSDualHttpBinding,NetTcpBinding,netNamedPipeBinding和NetMsmqBinding。其中以Net为前缀的NetTcpBinding,NetNamedBinding,NetMsmqBinding局限于.net平台使用,这几种绑定主要针对局域网内部使用的,并且NetNamedBinding仅限于同台机器使用。
以WS开头的绑定WSHttpBinding,WS2007HttpBinding这两种绑定实现了跨平台的,并且这两种绑定提供了很多WS-*标准的支持,两者的区别在于提供对于不同版本的WS-*标准的支持,这两个绑定成为互联网绑定。
BasicHttpBinding可以和之前的web service的.asms Web服务进行互操作的,只支持WS-BI(Basic Profile).
WSDualHttpBinding 实现了基于HTTP的双向通信,使得服务端可以回调客户端,这个原理以前说过,是通过建立两个相关联的HTTP通道进行双向通信的,不像NetTcpBinding,TCP协议本身就是双向通信的。
WSDualHttpBinding这个绑定也主要应用局域网环境。
b、基于绑定元素的绑定剖析:
默认情况下BasicHttpBinding就只有两种绑定元素:消息编码元素和传输元素,为绑定一个额外的
pulic static class Extension
{
public static void ListAllBindingElements(this Binding binding)
{
int index=1;
foreach(BindingElement element in binding.CreateBindingElements())
{
Console.WriteLine("{0},{1}",index++,element.GetType().FullName);
}
}
}
调用:Binding binding=new BasicHttpBinding(); binding.ListAllBindingElements();//打印出所有绑定元素的类型;
对于BasicHttpBinding,默认的消息编码方式是文本编码方式也可以修改成MTOM编码方式,binding.MessageEncoding =WSMessageEncoding.Mtom;
指定BasicHttpBinding安全协议的:BasicHttpBinding binding=new BasicHttpBinding(BasicHttpSecurityMode.Message(/.Transport)),//指定binding的安全传输方式。
BasicHttpSecurityMode.Message通过非对称加密方式对消息进行签名和加密的。
BasicHttpSecurityMode.Transport通过HTTPS(SSL)的方式实现传输安全。
5)、绑定配置:
<system.serviceModel><bindings>这个绑定里面,
<system.serviceModel><bindings>
<ws2007HttpBinding>
<binding name =".."...../>
</ws2007HttpBinding>
.....
</bindings></system.serviceModel>
浙公网安备 33010602011771号