メッセージ エンコーダを選択する
このトピックでは、Windows Communication Foundation (WCF) に用意されているメッセージ エンコーダ (バイナリ、テキスト、および MTOM (Message Transmission Optimization Mechanism)) を選択する際の基準について説明します。
WCF では、エンドポイント間でネットワークを介して行うデータの転送方法を、バインディング (バインディング要素 のシーケンスで構成) により指定します。メッセージ エンコーダは、バインディング スタックにあるメッセージ エンコーディング バインディング要素によって表されます。バインディングには、オプションのプロトコル バインディング要素 (セキュリティ バインディング要素や信頼できるメッセージング バインディング要素など)、必須のメッセージ エンコーディング バインディング要素、および必須のトランスポート バインディング要素が含まれます。
メッセージ エンコーディング バインディング要素は、オプションのプロトコル バインディング要素の下、必須のトランスポート バインディング要素の上に位置します。送信側では、メッセージ エンコーダにより出力 Message がシリアル化されてトランスポートに渡されます。受信側では、メッセージ エンコーダがトランスポートからシリアル化形式の Message を受信し、上位のプロトコル層が存在する場合はその層に、存在しない場合はアプリケーションに渡します。
既存のクライアントまたはサーバーに接続するときには、相手側が予測している方法でメッセージをエンコードする必要があるため、特定のメッセージ エンコーディングを選択できない場合があります。ただし、WCF サービスを作成している場合は、サービスを複数のエンドポイントで公開し、それぞれで異なるメッセージ エンコーディングを使用できます。これにより、クライアントは最適なエンドポイントでのサービスとの対話に最も適したエンコーディングを選択でき、最適なエンコーディングを選択する際の柔軟性が得られます。複数のエンドポイントを使用することにより、異なるメッセージ エンコーディングの利点を他のバインディング要素と組み合わせることも可能になります。
システム指定のエンコーダ
WCF に用意された 3 種類のメッセージ エンコーダは、次の 3 つのクラスによって表されます。
- TextMessageEncodingBindingElement は、書式なし XML エンコーディングと SOAP エンコーディングの両方をサポートするテキスト メッセージ エンコーダです。テキスト メッセージ エンコーダの書式なし XML エンコーディング モードは、テキスト ベースの SOAP エンコーディングと区別するために、"POX" (Plain Old XML) と呼ばれます。POX を有効にするには、MessageVersion プロパティを None に設定します。WCF エンドポイント以外のエンドポイントと相互運用する場合は、テキスト メッセージ エンコーダを使用します。
- BinaryMessageEncodingBindingElement は、バイナリ メッセージ エンコーダです。コンパクトなバイナリ形式を使用し、WCF と WCF との間の通信用に最適化されているため、相互運用できません。このエンコーダは、WCF に用意された 3 種類のエンコーダの中で、パフォーマンスが最も優れたエンコーダでもあります。
- MTOMMessageEncodingBindingElement は、MTOM エンコーディングを使用して、メッセージの文字エンコーディングとバージョン管理を指定するバインディング要素です。MTOM は、WCF メッセージでのバイナリ データの転送に有効なテクノロジです。MTOM エンコーダは、効率と相互運用性のバランスを取ろうとします。MTOM エンコーディングは、ほとんどの XML をテキスト形式で転送しますが、大きいサイズのバイナリ データ ブロックはテキストに変換せずにそのまま転送することによって最適化します。WCF に用意されたエンコーダの中で、MTOM は効率面でテキスト エンコーダ (最も遅い) とバイナリ エンコーダ (最も速い) の中間に位置します。
メッセージ エンコーダを選択する方法
メッセージ エンコーダを選択するために使用される一般的な要因を、次の表に示します。アプリケーションにとって重要な要因に優先順位を与えて、それらの要因に対して最適なメッセージ エンコーダを選択します。この表には示されていないその他の要因と、アプリケーションで必要になることがあるカスタム メッセージ エンコーダも考慮するようにしてください。
要因 | 説明 | この要因をサポートするエンコーダ |
---|---|---|
サポートされている文字セット |
TextMessageEncodingBindingElement と MtomMessageEncodingBindingElement は Unicode の UTF8 と UTF16 (ビッグ エンディアンとリトル エンディアン) エンコーディングのみをサポートしています。UTF7 や ASCII など、別のエンコーディングが要求される場合はカスタム エンコーディングを使用する必要があります。カスタム エンコーディングの例については https://go.microsoft.com/fwlink/?LinkId=119857 を参照してください。 |
テキスト |
検査 |
検査は、転送中にメッセージを調べる機能です。SOAP の使用に関係なく、テキスト エンコーディングでは、多くのアプリケーションで特別なツールを使用することなくメッセージの検査と分析が可能です。メッセージまたはトランスポートのいずれかのレベルで転送セキュリティを使用すると、メッセージの検査機能に影響がある点に注意してください。機密性はメッセージが検査されないように保護し、整合性はメッセージが変更されないように保護します。 |
テキスト |
信頼性 |
信頼性は、転送エラーに対するエンコーダの復元能力です。信頼性はメッセージ層、トランスポート層、またはアプリケーション層でも提供できます。すべての WCF 標準エンコーダは、信頼性が別の層で提供されることを前提としています。エンコーダは、転送エラーから回復する機能をほとんど備えていません。 |
なし |
単純さ |
単純さは、エンコード仕様に対応するエンコーダとデコーダの作成の容易さを表します。テキスト エンコーディングは、単純さの面で特に優れており、POX テキスト エンコーディングは SOAP 処理のサポートが不要なため、さらに優れています。 |
テキスト (POX) |
サイズ |
エンコーディングによって、コンテンツに課せられるオーバーヘッドの量が決まります。エンコードされたメッセージのサイズは、サービス操作の最大スループットに直接影響します。バイナリ エンコーディングは、一般にテキスト エンコーディングよりサイズが小さくなります。メッセージのサイズが優先事項である場合は、エンコーディング中にメッセージ コンテンツを圧縮することも検討してください。ただし、圧縮を行うとメッセージの送信者と受信者の両方で処理コストが大きくなります。 |
バイナリ |
ストリーム |
ストリーミングでは、アプリケーションはメッセージ全体が到着する前にメッセージの処理を開始できます。ストリーミングを効果的に使用するには、受信するアプリケーションが重要なデータの到着を待つ必要をなくすために、メッセージの冒頭で重要なデータが利用可能になっている必要があります。さらに、ストリーミングされた転送を使用するアプリケーションでは、メッセージ コンテンツに前方依存性がないように、メッセージ内のデータを順次編成していく必要があります。多くの場合、コンテンツのストリーミングと必要最小限のサイズで転送を行うこととの間で妥協を図る必要があります。 |
なし |
サードパーティ製ツールのサポート |
エンコーディングのサポート領域には、開発と診断があります。サードパーティの開発者は、POX 形式でエンコードされたメッセージを処理するためのライブラリとツールキットに多大な投資をしています。 |
テキスト (POX) |
相互運用性 |
この要因は、WCF のエンコーダの、非 WCF サービスとの相互運用性を表しています。 |
テキスト MTOM (部分的) |