上篇介紹 XmlDictionaryWriter/Reader 為編碼核心。實際框架中透過 MessageEncoder 進一步封裝,專責訊息編解碼。
定義於 System.ServiceModel.Channels,核心操作:
ReadMessage 多載(byte[]/Stream)WriteMessage 多載(Stream/byte[])ContentType、MediaType、MessageVersionIsContentTypeSupported 判斷 MIME 型別支援對應三種編碼方式,WCF 定義三對 Writer/Reader 及 Encoder/Factory:
XmlUTF8TextWriter/Reader → TextMessageEncoder → TextMessageEncoderFactoryXmlBinaryWriter/Reader → BinaryMessageEncoder → BinaryMessageEncoderFactoryXmlMtomWriter/Reader → MtomMessageEncoder → MtomMessageEncoderFactoryFactory 抽象基類 MessageEncoderFactory 僅暴露 Encoder 屬性。內部類型需透過反射實例化。
建立含位圖的 Message,分別用 TextMessageEncoderFactory 與 MtomMessageEncoderFactory 編碼寫入檔案。結果顯示:Text 將二進位 Base64 內聯於 SOAP Body;MTOM 產生 MIME Multipart/Related XOP 封裝,SOAP Body 僅含 xop:Include 參考,二進位內容分離為附件,實現傳輸優化。
客戶端調用 → ClientMessageFormatter 生成請求訊息 → 綁定層轉信道層。綁定為有序綁定元素組合,必含 MessageEncodingBindingElement 與 TransportBindingElement,共同完成編碼。
MessageEncodingBindingElement 抽象基類定義 CreateMessageEncoderFactory()。三種具體實作對應三種 Factory。建立通道堆疊時:
MessageEncodingBindingElement.BuildChannelFactory/Listener 建立 MessageEncoderFactory 置入 BindingContext。TransportBindingElement 建立 TransportChannelFactory/Listener,進而建立 TransportChannel。TransportChannel 從 BindingContext 取出 MessageEncoderFactory 用於實際編解碼。
圖 1 WCF 體系下訊息編碼實現
並無專門編碼通道,編碼工作由傳輸通道內建完成。