次の方法で共有


メッセージ エンコーダーの選択

この記事では、Windows Communication Foundation (WCF) に含まれるメッセージ エンコーダーのうち、バイナリ、テキスト、およびメッセージ送信の最適化メカニズム (MTOM) を選択するための条件について説明します。

WCF では、バインド要素のシーケンスで構成されるバインディングを使用して、エンドポイント間でネットワーク経由でデータを転送する方法を指定します。 メッセージ エンコーダーは、バインド スタック内のメッセージ エンコード バインド要素によって表されます。 バインディングには、セキュリティ バインディング要素や信頼できるメッセージング バインド要素、必要なメッセージ エンコード バインド要素、必要なトランスポート バインド要素など、オプションのプロトコル バインド要素が含まれます。

メッセージ エンコード バインド要素は、オプションのプロトコル バインド要素の下、および必要なトランスポート バインド要素の上にあります。 送信側では、メッセージ エンコーダーによって送信 Message がシリアル化され、トランスポートに渡されます。 受信側では、メッセージ エンコーダーはトランスポートから Message のシリアル化された形式を受け取り、存在する場合は上位のプロトコル 層に、そうでない場合はアプリケーションに渡します。

既存のクライアントまたはサーバーに接続する場合、メッセージを他の側が想定する方法でエンコードする必要があるため、特定のメッセージ エンコードの使用に関する選択肢がない場合があります。 ただし、WCF サービスを記述している場合は、それぞれ異なるメッセージ エンコードを使用して、複数のエンドポイントを介してサービスを公開できます。 これにより、クライアントは、最適なエンドポイント経由でサービスと通信するための最適なエンコードを選択できるだけでなく、クライアントに最適なエンコードを柔軟に選択できます。 複数のエンドポイントを使用すると、さまざまなメッセージ エンコーディングの利点を他のバインド要素と組み合わせることもできます。

System-Provided エンコーダー

WCF には、次の 3 つのクラスで表される 3 つのメッセージ エンコーダーが含まれています。

  • TextMessageEncodingBindingElementテキスト メッセージ エンコーダーでは、プレーン XML エンコードと SOAP エンコードの両方がサポートされます。 テキスト メッセージ エンコーダーのプレーン XML エンコード モードは、テキスト ベースの SOAP エンコードと区別するために"plain old XML" (POX) と呼ばれます。 POX を有効にするには、 MessageVersion プロパティを None に設定します。 テキスト メッセージ エンコーダーを使用して、WCF 以外のエンドポイントと相互運用します。

  • BinaryMessageEncodingBindingElementバイナリ メッセージ エンコーダーは、コンパクトなバイナリ形式を使用し、WCF から WCF への通信用に最適化されているため、相互運用できません。 これは、WCF が提供するすべてのエンコーダーの中で最もパフォーマンスの高いエンコーダーでもあります。

  • MtomMessageEncodingBindingElementは、MTOM エンコードを使用したメッセージの文字エンコードとメッセージのバージョン管理を指定するバインディング要素です。 MTOM は、WCF メッセージでバイナリ データを送信するための効率的なテクノロジです。 MTOM エンコーダーは、効率と相互運用性のバランスを取ろうとします。 MTOM エンコードは、ほとんどの XML をテキスト形式で送信しますが、テキストに変換することなく、as-is送信することでバイナリ データの大きなブロックを最適化します。 効率の点では、WCF が提供するエンコーダーの中で、MTOM はテキスト (最も遅い) とバイナリ (最も高速) の間にあります。

メッセージ エンコーダーを選択する方法

次の表では、メッセージ エンコーダーの選択に使用される一般的な要因について説明します。 アプリケーションにとって重要な要素に優先順位を付け、これらの要因に最も適したメッセージ エンコーダーを選択します。 この表に記載されていないその他の要因と、アプリケーションで必要になる可能性があるカスタム メッセージ エンコーダーを必ず考慮してください。

要因 説明 この要素をサポートするエンコーダー
サポートされている文字セット TextMessageEncodingBindingElement および MtomMessageEncodingBindingElement では、UTF8 および UTF16 Unicode (ビッグ エンディアン および リトル エンディアン) エンコードのみがサポートされます。 UTF7 や ASCII などの他のエンコードが必要な場合は、カスタム エンコーダーを使用する必要があります。 カスタム エンコーダーのサンプルについては、「 カスタム メッセージ エンコーダー」を参照してください。 テキスト
調査 検査は、送信中にメッセージを検査する機能です。 SOAP を使用する場合と使用しないテキスト エンコーディングを使用すると、特殊なツールを使用せずに、多くのアプリケーションでメッセージを検査および分析できます。 メッセージレベルまたはトランスポートレベルで転送セキュリティを使用すると、メッセージを検査する機能に影響します。 機密性は、メッセージが検査されるのを防ぎ、整合性によってメッセージが変更されないように保護します。 テキスト
信頼性 信頼性は、送信エラーに対するエンコーダーの回復性です。 信頼性は、メッセージ、トランスポート、またはアプリケーション層でも提供できます。 すべての標準 WCF エンコーダーは、別のレイヤーが信頼性を提供していることを前提としています。 エンコーダーには、伝送エラーから回復する機能はほとんどありません。 無し
簡略 簡易性は、エンコード仕様のエンコーダーとデコーダーを簡単に作成できることを表します。 テキスト エンコードは、わかりやすくするために特に有利であり、POX テキスト エンコードには SOAP の処理をサポートする必要がないという追加の利点があります。 テキスト (POX)
サイズ エンコードによって、コンテンツに課されるオーバーヘッドの量が決まります。 エンコードされたメッセージのサイズは、サービス操作の最大スループットに直接関連します。 バイナリ エンコードは、通常、テキスト エンコードよりもコンパクトです。 メッセージ サイズが Premium の場合は、エンコード中にメッセージの内容を圧縮することも検討してください。 ただし、圧縮では、メッセージの送信者と受信者の両方の処理コストが追加されます。 バイナリ
ストリーミング ストリーミングを使用すると、アプリケーションはメッセージ全体が到着する前にメッセージの処理を開始できます。 ストリーミングを効果的に使用するには、メッセージの先頭でメッセージの重要なデータを使用できるようにする必要があります。そのため、受信側のアプリケーションがメッセージの到着を待機する必要はありません。 さらに、ストリーム転送を使用するアプリケーションでは、コンテンツに前方依存関係が含まれていないように、メッセージ内のデータを増分的に整理する必要があります。 多くの場合、ストリーミング コンテンツと、そのコンテンツの可能な限り小さい転送サイズとの間で妥協する必要があります。 無し
サード パーティ製ツールのサポート エンコードのサポート領域には、開発と診断が含まれます。 サードパーティの開発者は、POX 形式でエンコードされたメッセージを処理するためのライブラリとツールキットに大きな投資を行っています。 テキスト (POX)
相互運用性 この要因は、WCF 以外のサービスと相互運用する WCF エンコーダーの機能を指します。 テキスト

MTOM (部分)

注: バイナリ エンコーダーを使用する場合、XMLReader の作成時に IgnoreWhitespace 設定を使用しても効果はありません。 たとえば、サービス操作内で次の操作を行う場合です。

public void OperationContract(XElement input)
{
    Console.WriteLine("{0}", input.Value);
    int counter = 0;
    var xreader = input.CreateReader();
    var reader = XmlReader.Create(xreader, new XmlReaderSettings() { IgnoreWhitespace = true });
    while (reader.Read())
    {
        counter++;
    }

    Console.WriteLine("Read {0} lines with reader", counter);
}

IgnoreWhitespace 設定は無視されます。

圧縮とバイナリ エンコーダー

WCF 4.5 以降、WCF バイナリ エンコーダーは圧縮のサポートを追加します。 これにより、WCF クライアントから圧縮されたメッセージを送信するために gzip/deflate アルゴリズムを使用したり、セルフホステッド WCF サービスからの圧縮メッセージで応答したりできます。 この機能により、HTTP トランスポートと TCP トランスポートの両方で圧縮が可能になります。 IIS ホスト サーバーを構成することで、IIS でホストされる WCF サービスが圧縮された応答を送信できるように常に有効にすることができます。 圧縮の種類は、 BinaryMessageEncodingBindingElement.CompressionFormat プロパティを使用して構成されます。 このプロパティは、次のいずれかの System.ServiceModel.Channels.CompressionFormat 列挙値に設定されます。

このプロパティは binaryMessageEncodingBindingElement でのみ公開されるため、この機能を使用するには、次のようなカスタム バインドを作成する必要があります。

<customBinding>
  <binding name="BinaryCompressionBinding">
    <binaryMessageEncoding compressionFormat ="GZip" />
    <httpTransport />
 </binding>
</customBinding>

クライアントとサービスの両方が圧縮メッセージの送受信に同意する必要があるため、compressionFormat プロパティはクライアントとサービスの両方の binaryMessageEncoding 要素で構成する必要があります。 サービスまたはクライアントのいずれかが圧縮用に構成されていないが、もう一方の側が圧縮用に構成されている場合、ProtocolException がスローされます。 圧縮の有効化は慎重に検討する必要があります。 圧縮は、主にネットワーク帯域幅がボトルネックである場合に便利です。 CPU がボトルネックになっている場合、圧縮によってスループットが低下します。 アプリケーションにメリットがあるかどうかを確認するには、シミュレートされた環境で適切なテストを行う必要があります

こちらも参照ください