WCF分发简述-ChannelDispatcher,EndpointDispatcher,MessageFilter

本文深入探讨WCF中的ServiceHost和ChannelDispatcher的作用,并详细解释了EndpointDispatcher如何通过MessageFilter选择匹配的Message,包括ActionMessageFilter、EndpointAddressMessageFilter等预定义的六种MessageFilter。
摘要由CSDN通过智能技术生成

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

1ServiceHost ChannelDispatcher

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

 

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。继承类图为:

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值