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是端对端的,路由服务是不需要理解消息里面的关于ReliableSession的messageheader的。所以路由服务中的ReliableSession必须是关闭的,否则就等于在客户端和路由服务之间建立ReliableSession了。路由服务关闭了ReliableSession,但是客户端发送的消息中有很多关于ReliableSession的messageheader是必须要被理解的,但是路由服务的UnderstoodHeaders集合中又不包含这些messageheader,所以必须要通过如下方式来使路由服务不需要理解这些必须被理解的messageheader,这样就可以让路由服务继续处理消息。设置方式如下:
host.Description.Endpoints[0].Behaviors.Add(newMustUnderstandBehavior(false));
host是ServiceHost的实例。当然可以使用配置文件来设置这个行为。