共用方式為


自訂編碼器

本主題討論如何建立自定義編碼器。

在 Windows Communication Foundation (WCF) 中,您可以使用 系結 來指定如何在端點之間跨網路傳輸數據。 系結是由綁定 序列所組成。 系結包含選擇性通訊協議綁定項,例如安全性、必要的 訊息編碼器 綁定項,以及必要的傳輸綁定項。 訊息編碼器是由訊息編碼綁定項表示。 WCF 包含三個訊息編碼器:二進位、訊息傳輸優化機制(MTOM)和文字。

訊息編碼綁定項會將傳出 Message 串行化並將它傳遞至傳輸層,或者從傳輸層接收訊息的串行化形式,然後如果通訊協定層存在,將它傳遞至該層;如果通訊協定層不存在,則傳遞給應用程式。

訊息編碼器將 Message 實例轉換成線上表示並反向轉換。 雖然編碼器會描述為位於通道堆疊中的傳輸層上方,但它們位於傳輸層內。 傳輸(例如 HTTP)會根據傳輸標準的需求來格式化訊息。 編碼器 (例如 Text Xml) 只會編碼訊息。

連線到預先存在的用戶端或伺服器時,您可能沒有使用特定訊息編碼的選擇。 不過,WCF 服務可以透過多個端點來存取,每個端點都有不同的訊息編碼器。 當單一編碼系統無法涵蓋您服務的全部受眾時,請考慮在多個端點提供服務。 用戶端應用程式接著可以選擇最適合它們的端點。 使用多個端點可讓您結合不同訊息編碼器與其他綁定項的優點。

System-Provided 編碼器

WCF 提供數個系統提供的系結,其設計目的是涵蓋最常見的應用程式案例。 每個系結都會結合傳輸、訊息編碼器和其他選項(例如安全性)。 本主題描述如何擴充 TextWCF 中包含的、 BinaryMTOM 訊息編碼器,或建立您自己的自定義編碼器。 文字訊息編碼器同時支援純 XML 編碼和 SOAP 編碼。 簡訊編碼器的純 XML 編碼模式稱為 POX (“Plain Old XML”) 編碼器,以區分它與以文字為基礎的 SOAP 編碼。

如需由系統提供之系結所提供之綁定項組合的詳細資訊,請參閱 選擇傳輸中的對應一節。

如何使用 System-Provided 編碼器

使用衍生自 MessageEncodingBindingElement的類別,將編碼新增至系結。

WCF 提供下列衍生自 類別的 MessageEncodingBindingElement 綁定項類型,可提供文字、二進位和訊息傳輸優化機制 (MTOM) 編碼:

  • TextMessageEncodingBindingElement:兼容性最強,但對 XML 訊息的編碼效率最低。 Web 服務或 Web 服務用戶端通常可以瞭解文字 XML。 不過,以文字形式傳輸大型二進位數據區塊並不有效。

  • BinaryMessageEncodingBindingElement:表示綁定項,指定用於二進位式 XML 訊息的字元編碼和訊息版本設定。 這是最有效率的編碼選項,但最不互通,因為 WCF 端點只支援它。

  • MtomMessageEncodingBindingElement:表示綁定項,這個綁定項會使用訊息傳輸優化機制 (MTOM) 編碼來指定訊息所使用的字元編碼和訊息版本設定。 MTOM 是一種在 WCF 訊息中傳輸二進位數據的有效技術。 MTOM 編碼器會嘗試在效率與互作性之間取得平衡。 MTOM 編碼會以文字形式傳輸大部分的 XML,但對於大型的二進位數據區塊,則藉由直接傳輸 as-is而不轉換成文字,達到最佳化效果。

繫結項目會建立二進位、MTOM 或文字 MessageEncoderFactory。 工廠會建立二進位、MTOM 或文字MessageEncoderFactory 實例。 一般而言,只有單一實例。 不過,如果使用會話,可能會為每個會話提供不同的編碼器。 二進位編碼器會利用這個 來協調動態字典(請參閱 XML 基礎結構)。

ReadMessageWriteMessage 方法是編碼器的核心。 方法提供從數據流或 Byte 陣列讀取訊息的方法。 當傳輸以緩衝模式運作時,會使用位元組陣列。 訊息一律會寫入數據流。 如果傳輸必須緩衝訊息,它會提供執行緩衝處理的數據流。

其餘成員會處理支援內容、媒體類型和 MessageVersion。 傳輸會呼叫這些編碼器方法來測試傳入訊息是否可以由它譯碼,或判斷傳出訊息是否對這個編碼器有效。

這三個編碼器實作中的每一個都會新增與特定編碼相關的屬性,而且完全可設定。 編碼器也會公開具有安全預設值的讀取器配額。 如需配額的討論,請參閱 XML 基礎結構。

System-Provided 編碼器的功能

系統提供的編碼器提供許多功能。

資源整合

每個編碼器實作都會嘗試盡可能多地合併資源。 減少配置是提升受控程式碼效能的關鍵方法。 若要完成此共用,實作會使用 SynchronizedPool 類別。 C# 檔案包含這個類別所使用的其他優化描述。

XmlDictionaryReaderXmlDictionaryWriter 實例被共用並重新初始化,以防止為每個訊息分配新實例。 針對讀取器,當呼叫 OnClose 時,Close() 回呼會回收讀取器。 編碼器也會回收建構訊息時所使用的一些訊息狀態物件。 這些集區的大小可由衍生自MaxReadPoolSize的三個類別中的每個類別上的MaxWritePoolSizeMessageEncodingBindingElement屬性設定。

二進位編碼

當二進位編碼使用會話時,動態字典字串必須傳達給訊息的接收者。 這是藉由在訊息前面加上動態字典字串來完成。 接收者會移除字串,將它們新增至工作階段,並處理該訊息。 正確傳遞字典字串需要緩衝傳輸。

字串會透過內部 AddSessionInformationToMessage 方法附加至訊息。 它會將字串以UTF-8格式新增至訊息的前面,並在字串前加上其長度作為前綴。 然後,整個字典標頭前面會加上其數據的長度。 反向作業是由內部 ExtractSessionInformationFromMessage 方法執行。

除了處理動態字典索引鍵之外,會以唯一的方式接收緩衝的會話訊息。 二進位編碼器會使用內部 MessagePatterns 類別來解構二進位數據流,而不是先在文件上建立讀取器並對其進行處理。 其概念是,大部分訊息都有一組特定標頭,會在 WCF 產生時以特定順序顯示。 模式系統會根據其預期方式拆解訊息。 如果成功,它會初始化 MessageHeaders 物件,而不剖析 XML。 如果不行,它會改用標準方法。

MTOM 編碼

類別 MtomMessageEncodingBindingElement 具有稱為 MaxBufferSize的其他組態屬性。 這會對讀取訊息時允許緩衝的數據量施加上限。 XML 資訊集 (Infoset) 或其他 MIME 元件可能需要緩衝處理,才能將所有 MIME 元件重新組合成單一訊息。

若要正確使用 HTTP,內部 MTOM 訊息編碼器類別提供一些內部 API,GetContentType 也是內部的,而 WriteMessage 則是公用的並且可以覆寫。 必須進行更多通訊,以確保 HTTP 標頭中的值與 MIME 標頭中的值一致。

在內部,MTOM 訊息編碼器會使用 WCF 的文字讀取器,而且類似於文字編碼器。 主要差異在於,它會將大型二進位區塊或「二進位大型物件」(BLOB)優化,方法是在內嵌至訊息位元組之前,不要將它們轉換成Base-64編碼。 相反地,這些 BLOB 會保持在已擷取的狀態,並作為 MIME 附件使用。

撰寫您自己的編碼器

若要實作您自己的自訂訊息編碼器,您必須提供下列抽象基類的自定義實作:

將訊息的記憶體表示轉換為可寫入數據流的表示形式,這個過程封裝在 MessageEncoder 類別中。該類別充當 XML 讀取器和支援特定 XML 編碼類型的 XML 寫入器的工廠。

這是您在這些方法中撰寫的程式碼,可處理標準傳輸通訊協定與自定義編碼之間的轉換。

接下來,您必須撰寫建立自定義編碼器的 Factory 類別。 覆寫Encoder以傳回自定義MessageEncoder的實例。

然後將您的自定義 MessageEncoderFactory 連接到用於設定服務或客戶端的綁定元素堆疊,方法是覆寫 CreateMessageEncoderFactory 方法以返回此工廠的實例。

WCF 提供兩個範例,說明此程式的程式範例: 自定義訊息編碼器:自定義文字編碼器自定義訊息編碼器:壓縮編碼器

另請參閱