详解MustUnderstand属性

MessageHeaderInfo类中有一个 MustUnderstand属性,按照MSDN的解释,该属性指示消息的接收者必须理解此messageheader,如果不能理解此消息头,就会抛出ProtocolException,消息就不会被继续处理下去。

那么消息头如何算是能被理解的呢?主要取决于MessageHeaders.UnderstoodHeaders属性,该属性表明了当前消息中可以被理解的messageheader,如果消息中有一个消息头不在UnderstoodHeaders中,那么就会抛出上面提到的ProtocolException

那么UnderstoodHeader里面的有哪些可被理解的messageheader又是被谁控制的呢?这是通过绑定来控制的,如果你的绑定支持ws-addressing协议,那么UnderstoodHeaders集合中就会有To元素,表示To这个messageheader已经被理解了。

什么时候我们会关心这个问题?当我们自己写路由服务的时候,问题就出现了,例如:客户端和服务端都需要支持ReliableSession的时候,设置如下:

NetTcpBinding binding = new NetTcpBinding();

binding.ReliableSession.Enabled = true;

但是路由服务不能支持ReliableSession,因为ReliableSession是端对端的,路由服务是不需要理解消息里面的关于ReliableSessionmessageheader的。所以路由服务中的ReliableSession必须是关闭的,否则就等于在客户端和路由服务之间建立ReliableSession了。路由服务关闭了ReliableSession,但是客户端发送的消息中有很多关于ReliableSessionmessageheader是必须要被理解的,但是路由服务的UnderstoodHeaders集合中又不包含这些messageheader,所以必须要通过如下方式来使路由服务不需要理解这些必须被理解的messageheader,这样就可以让路由服务继续处理消息。设置方式如下:

host.Description.Endpoints[0].Behaviors.Add(newMustUnderstandBehavior(false));

hostServiceHost的实例。当然可以使用配置文件来设置这个行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值