詳解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的實例。當然可以使用配置文件來設置這個行爲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章