WCF分发简述-ChannelDispatcher,EndpointDispatcher,MessageFilter
2011-07-08 13:34 破狼 阅读(3135) 评论(8) 编辑 收藏 举报
学习和使用WCF已经有很长一段时间了,但是一直不敢写关于这方面的blog。以为院子里有个WCF高手(Artech),我学习WCF大部分就是看的他的blog。所以在这里感谢Artech大哥的分享。前些日子的XX问到这个问题,所以我才斗胆有了这篇blog,欢迎高手指正。
1:ServiceHost 和ChannelDispatcher:
没使用过Viso,但是现在的机子上只有这个东西,所以随便乱画:
WCF分发是指在服务端信道监听到Message,路由选择那个service,operation操作的过程,我的理解。
首先我们的WCF会有一个宿主程序(控制台,Windows服务,或者是IIS寄宿等等),当我们的ServiceHost调用Open方法,WCF就会创建我们的多个信道分发器(ChannelDispatcher),每个ChannelDispatcher都会拥有一个信道监听器(ChannelListener),所以我们的信道分发器的取决我我们配置中的Listener Url。ChannelListener就有一直在固定的端口监听,等到Message的到来,调用AcceptChannel构建信道形成信道栈,开始对Message的处理。
2:EndpointDispatcher
接上,Message处理开始后,ChannelDispatcher就会选择一个匹配的EndpointDispatcher来处理这条Message。这里EndpointDispatcher的选择匹配是更具EndpointDispatcher的属性ContractFilter和AddressFilter。
讲到这里我们就不得不在说说wcf中MessageFilter类,他有两个重载方法Match,用来验证是否匹配Message。他在Wcf订MS为我们预定义了6中MessageFilter。继承类图为:
MessageFilter Class |
Comment |
ActionMessageFilter |
表示一个查询,该查询可以测试消息的操作是否为指定操作集合中的操作。描述该服务契约是否拥有该操作Action。根据传入的SAOP消息中“Action”值和契约上的操作进行比较,确定是否匹配匹配。该筛选器在初始化时将包含一个操作字符串列表 |
EndpointAddressMessageFilter |
用于测试消息是否满足指定终结点地址的要求的查询。SOAP消息中的“To”地址与终结点地址进行比较,预期它们完全匹配,也会传入消息中获得的寻址报头和终结点要求的一组寻址报头进行比较,要使最终匹配的结果返回true,必须满足以下两个条件: 1. 筛选器的地址统一资源标识符 (URI) 必须与消息 To 标头中的统一资源标识符相同。2. 筛选器地址中的每个终结点参数都必须在消息中找到一个与之匹配的标头。 |
XPathMessageFilter |
XPathMessageFilter 使用 XPath 表达式来确定 XML 文档是否包含特定元素、属性、文本或其他 XML 语法构造。 通常,应用程序在终结点使用 XPathMessageFilter 来查询 SOAP 消息的内容,然后基于该查询的结果采取适当的操作 |
PrefixEndpointAddressMessageFilter |
该查询使用 URI 组件的“最长前缀匹配”来测试消息是否与 EndpointAddress 相匹配。与 EndpointAddressMessageFilter 执行相同的查询,不同的是测试消息是否与终结点地址相匹配是由“最长前缀匹配”完成的。这表示筛选器中指定的 URI 不需要与消息的 URI 完全匹配,不过必须作为前缀包含在该 URI 中。 |
MatchAllMessageFilter |
所有消息都匹配给定终结点,return true; |
MatchNoneMessageFilter |
所有消息都不匹配给定终结点,return false; |
默认情况下ContractFilter采用的是ActionMessageFilter,而AddressFliter采用的是EndpointAddressMessageFilter,我们可以采用ServiceBehaviorAttribute改变MessageFilter。
我们的WCF利用EndpointDispatcher的这两个MessageFilter来选择MessageFilter,分发到相应的Endpoint。
作者:破 狼
出处:http://www.cnblogs.com/whitewolf/
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。