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>

 

  

  

 

 

 

posted on 2013-07-04 21:48  Kelly_HanShuai  阅读(161)  评论(0)    收藏  举报