WCF編碼機制幾種不同方式介紹
我們今天會通過這篇文章介紹的內容繼續為大家講解一些有關WCF中的重要內容。主要就是針對WCF編碼機制的相關內容進行一個詳細的闡述,希望能給大家帶來一些幫助,提高編程能力。#t#
在客戶端,以方法調用形式體現的服務訪問通過ClientMessageFormatter生成請求消息。該請求消息最終通過綁定對象從服務模型層轉到信道層。我們說綁定是綁定元素的有序組合,對于所有類型的綁定來說,有兩個綁定類型是必不可少的:MessageEncodingBindingElement和TransportBindingElement。而消息的編碼由這兩個綁定元素共同完成。
3種WCF編碼機制方式:Text、Binary和MTOM;對應3種不同的XmlDictionaryWriter/XmlDictionaryReader:XmlUTF8TextWriter/ XmlUTF8TextReader、XmlBinaryWriter/XmlBinaryReader和XmlMtomWriter/XmlMtomReader;3種XmlDictionaryWriter/XmlDictionaryReader又對應著3種MessageEncoder:TextMessageEncoder、BinaryMessagEncoder和MtomMessageEncoder;這3種不同的MessageEncoder又具有它們各自的MessageEncoderFactory:TextMessageEncoderFactory、BinaryMessagEncoderFactory和MtomMessageEncoderFactory。最終這3種MessageEncoderFactory被3種相應的MessageEncodingBindingElement用于進行具體的編碼。MessageEncodingBindingElement通過CreateMessageEncoderFactory得到相應的MessageEncoderFactory。
- public abstract class MessageEncodingBindingElement : BindingElement
- {
- //其他成員
- public abstract MessageEncoderFactory CreateMessageEncoderFactory();
- public override T GetProperty<T>(BindingContext context)
- where T: class; public abstract MessageVersion MessageVersion
- {
- get;
- set;
- }
- }
對應著3種不同的MessageEncoderFactory,WCF定義了3種不同的MessageEncodingBindingElement,它們分別是:TextMessageEncodingBindingElement、BinaryMessageEncodingBindingElement和MtomMessageEncodingBindingElement。
在介紹綁定的時候,我們說BindingElement創建相應的ChannelFactory/ChannelListener,而ChannelFactory/ChannelListener最終創建相應的Channel進行消息的處理。這種說法是不準確的,并不是所有的BindingElement都會創建Channel,實際上沒有用于專門編碼的Channel,具體的編碼工作是TransportChannel完成的。
當通過綁定對象創建信道棧的時候,MessageEncodingBindingElement的BuildChannelFactory/BuildChannelListener方法首先被調用,MessageEncodingBindingElement會創建相應的MessageEncoderFactory對象,將其置于當前的BindingContext中。然后TransportBindingElement的BuildChannelFactory/BuildChannelListener方法被調用,并創建TransportChannelFactory/TransportChannelListener對象,TransportChannelListener和TransportChannelFactory創建TransportChannel用于請求監聽和消息發送,與此同時TransportChannel會將MessageEncoderFactory從BindingContext獲取下來用于WCF編碼機制的解碼和編碼。