WCF編碼機(jī)制幾種不同方式介紹
我們今天會(huì)通過這篇文章介紹的內(nèi)容繼續(xù)為大家講解一些有關(guān)WCF中的重要內(nèi)容。主要就是針對(duì)WCF編碼機(jī)制的相關(guān)內(nèi)容進(jìn)行一個(gè)詳細(xì)的闡述,希望能給大家?guī)硪恍椭岣呔幊棠芰Α?t#
在客戶端,以方法調(diào)用形式體現(xiàn)的服務(wù)訪問通過ClientMessageFormatter生成請(qǐng)求消息。該請(qǐng)求消息最終通過綁定對(duì)象從服務(wù)模型層轉(zhuǎn)到信道層。我們說綁定是綁定元素的有序組合,對(duì)于所有類型的綁定來說,有兩個(gè)綁定類型是必不可少的:MessageEncodingBindingElement和TransportBindingElement。而消息的編碼由這兩個(gè)綁定元素共同完成。
3種WCF編碼機(jī)制方式:Text、Binary和MTOM;對(duì)應(yīng)3種不同的XmlDictionaryWriter/XmlDictionaryReader:XmlUTF8TextWriter/ XmlUTF8TextReader、XmlBinaryWriter/XmlBinaryReader和XmlMtomWriter/XmlMtomReader;3種XmlDictionaryWriter/XmlDictionaryReader又對(duì)應(yīng)著3種MessageEncoder:TextMessageEncoder、BinaryMessagEncoder和MtomMessageEncoder;這3種不同的MessageEncoder又具有它們各自的MessageEncoderFactory:TextMessageEncoderFactory、BinaryMessagEncoderFactory和MtomMessageEncoderFactory。最終這3種MessageEncoderFactory被3種相應(yīng)的MessageEncodingBindingElement用于進(jìn)行具體的編碼。MessageEncodingBindingElement通過CreateMessageEncoderFactory得到相應(yīng)的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;
- }
- }
對(duì)應(yīng)著3種不同的MessageEncoderFactory,WCF定義了3種不同的MessageEncodingBindingElement,它們分別是:TextMessageEncodingBindingElement、BinaryMessageEncodingBindingElement和MtomMessageEncodingBindingElement。
在介紹綁定的時(shí)候,我們說BindingElement創(chuàng)建相應(yīng)的ChannelFactory/ChannelListener,而ChannelFactory/ChannelListener最終創(chuàng)建相應(yīng)的Channel進(jìn)行消息的處理。這種說法是不準(zhǔn)確的,并不是所有的BindingElement都會(huì)創(chuàng)建Channel,實(shí)際上沒有用于專門編碼的Channel,具體的編碼工作是TransportChannel完成的。
當(dāng)通過綁定對(duì)象創(chuàng)建信道棧的時(shí)候,MessageEncodingBindingElement的BuildChannelFactory/BuildChannelListener方法首先被調(diào)用,MessageEncodingBindingElement會(huì)創(chuàng)建相應(yīng)的MessageEncoderFactory對(duì)象,將其置于當(dāng)前的BindingContext中。然后TransportBindingElement的BuildChannelFactory/BuildChannelListener方法被調(diào)用,并創(chuàng)建TransportChannelFactory/TransportChannelListener對(duì)象,TransportChannelListener和TransportChannelFactory創(chuàng)建TransportChannel用于請(qǐng)求監(jiān)聽和消息發(fā)送,與此同時(shí)TransportChannel會(huì)將MessageEncoderFactory從BindingContext獲取下來用于WCF編碼機(jī)制的解碼和編碼。