学习和使用WCF已经有很长一段时间了,但是一直不敢写关于这方面的blog。以为院子里有个WCF高手(Artech),我学习WCF大部分就是看的他的blog。所以在这里感谢Artech大哥的分享。前些日子的XX问到这个问题,所以我才斗胆有了这篇blog,欢迎高手指正。

1ServiceHost ChannelDispatcher

   没使用过Viso,但是现在的机子上只有这个东西,所以随便乱画:

 

WCF分发简述-ChannelDispatcher,EndpointDispatcher,MessageFilter_第1张图片

WCF分发是指在服务端信道监听到Message,路由选择那个service,operation操作的过程,我的理解。

首先我们的WCF会有一个宿主程序(控制台,Windows服务,或者是IIS寄宿等等),当我们的ServiceHost调用Open方法,WCF就会创建我们的多个信道分发器(ChannelDispatcher),每个ChannelDispatcher都会拥有一个信道监听器(ChannelListener),所以我们的信道分发器的取决我我们配置中的Listener Url。ChannelListener就有一直在固定的端口监听,等到Message的到来,调用AcceptChannel构建信道形成信道栈,开始对Message的处理。

2EndpointDispatcher

接上,Message处理开始后,ChannelDispatcher就会选择一个匹配的EndpointDispatcher来处理这条Message。这里EndpointDispatcher的选择匹配是更具EndpointDispatcher的属性ContractFilter和AddressFilter。

讲到这里我们就不得不在说说wcf中MessageFilter类,他有两个重载方法Match,用来验证是否匹配Message。他在Wcf订MS为我们预定义了6中MessageFilter。继承类图为:

WCF分发简述-ChannelDispatcher,EndpointDispatcher,MessageFilter_第2张图片

默认情况下ContractFilter采用的是ActionMessageFilter,而AddressFliter采用的是EndpointAddressMessageFilter,我们可以采用ServiceBehaviorAttribute改变MessageFilter。

我们的WCF利用EndpointDispatcher的这两个MessageFilter来选择MessageFilter,分发到相应的Endpoint