メッセージ エンコーダーを選択するChoosing a Message Encoder

このトピックでは、Windows Communication Foundation (WCF) に含まれているメッセージ エンコーダーを選択するための基準をについて説明します。 バイナリ、テキスト、および Message Transmission Optimization Mechanism (MTOM)。This topic discusses criteria for choosing among the message encoders that are included in Windows Communication Foundation (WCF): binary, text, and Message Transmission Optimization Mechanism (MTOM).

WCF では、エンドポイントの間をネットワーク経由でデータを転送する方法を指定する、バインド、一連の構成をされますバインド要素します。In WCF, you specify how to transfer data across a network between endpoints by means of a binding, which is made up of a sequence of binding elements. メッセージ エンコーダーは、バインディング スタックにあるメッセージ エンコーディング バインド要素によって表されます。A message encoder is represented by a message encoding binding element in the binding stack. バインディングには、オプションのプロトコル バインド要素 (セキュリティ バインド要素や信頼できるメッセージング バインド要素など)、必須のメッセージ エンコーディング バインド要素、および必須のトランスポート バインド要素が含まれます。A binding includes optional protocol binding elements, such as a security binding element or reliable messaging binding element, a required message encoding binding element, and a required transport binding element.

メッセージ エンコーディング バインド要素は、オプションのプロトコル バインド要素の下、必須のトランスポート バインド要素の上に位置します。The message encoding binding element sits below the optional protocol binding elements and above the required transport binding element. 送信側では、メッセージ エンコーダーにより出力 Message がシリアル化されてトランスポートに渡されます。On the outgoing side, a message encoder serializes the outgoing Message and passes it to the transport. 受信側では、メッセージ エンコーダーがトランスポートからシリアル化形式の Message を受信し、上位のプロトコル層が存在する場合はその層に、存在しない場合はアプリケーションに渡します。On the incoming side, a message encoder receives the serialized form of a Message from the transport and passes it to the higher protocol layer, if present, or to the application, if not.

既存のクライアントまたはサーバーに接続するときには、相手側が予測している方法でメッセージをエンコードする必要があるため、特定のメッセージ エンコーディングを選択できない場合があります。When connecting to a pre-existing client or server, you may not have a choice about using a particular message encoding since you need to encode your messages in a way that the other side is expecting. ただし場合は、WCF サービスを作成して公開できます、複数のエンドポイントを使用してサービス異なるメッセージ エンコーディングを使用して各。However, if you are writing an WCF service, you can expose your service through multiple endpoints, each using a different message encoding. これにより、クライアントは最適なエンドポイントでのサービスとの対話に最も適したエンコーディングを選択でき、最適なエンコーディングを選択する際の柔軟性が得られます。This allows clients to choose the best encoding for talking to your service over the endpoint that is best for them, as well as giving your clients the flexibility to choose the encoding that is best for them. 複数のエンドポイントを使用することにより、異なるメッセージ エンコーディングの利点を他のバインド要素と組み合わせることも可能になります。Using multiple endpoints also allows you to combine the advantages of different message encodings with other binding elements.

システム指定のエンコーダーSystem-Provided Encoders

WCF には、次の 3 つのクラスによって表される、3 つのメッセージ エンコーダーが含まれています。WCF includes three message encoders, which are represented by the following three classes:

  • TextMessageEncodingBindingElement は、書式なし XML エンコーディングと SOAP エンコーディングの両方をサポートするテキスト メッセージ エンコーダーです。TextMessageEncodingBindingElement, the text message encoder, supports both plain XML encoding and SOAP encoding. テキスト メッセージ エンコーダーの書式なし XML エンコーディング モードは、テキスト ベースの SOAP エンコーディングと区別するために、"POX" (Plain Old XML) と呼ばれます。The plain XML encoding mode of the text message encoder is called "plain old XML" (POX) to distinguish it from text-based SOAP encoding. POX を有効にするには、MessageVersion プロパティを None に設定します。To enable POX, set the MessageVersion property to None. WCF 以外のエンドポイントと相互運用するには、テキスト メッセージ エンコーダーを使用します。Use the text message encoder to interoperate with non-WCF endpoints.

  • BinaryMessageEncodingBindingElement、、バイナリ メッセージ エンコーダーは、コンパクトなバイナリ形式を使用してと WCF WCF の通信に最適化されたため相互運用可能なではありません。BinaryMessageEncodingBindingElement, the binary message encoder, uses a compact binary format and is optimized for WCF to WCF communication, and hence is not interoperable. これが、WCF は、すべてのエンコーダーのほとんどのパフォーマンスの高いエンコーダーです。This is also the most performant encoder of all the encoders WCF provides.

  • MtomMessageEncodingBindingElement は、MTOM エンコーディングを使用して、メッセージの文字エンコーディングとバージョン管理を指定するバインド要素です。MtomMessageEncodingBindingElement, the binding element, specifies the character encoding and message versioning for messages using MTOM encoding. MTOM は、WCF メッセージでバイナリ データを転送するための効率的なテクノロジです。MTOM is an efficient technology for transmitting binary data in WCF messages. MTOM エンコーダーは、効率と相互運用性のバランスをとろうとします。The MTOM encoder attempts to create a balance between efficiency and interoperability. MTOM エンコーディングは、ほとんどの XML をテキスト形式で転送しますが、大きいサイズのバイナリ データ ブロックはテキストに変換せずにそのまま転送することによって最適化します。The MTOM encoding transmits most XML in textual form, but optimizes large blocks of binary data by transmitting them as-is, without conversion to text. WCF が提供するエンコーダー間で、効率性という点は、MTOM は、(最も遅い) 間のテキストとバイナリ (最も速い) です。In terms of efficiency, among the encoders WCF provides, MTOM is in-between text (the slowest) and binary (the fastest).

メッセージ エンコーダーを選択する方法How to Choose a Message Encoder

メッセージ エンコーダーを選択するために使用される一般的な要因を、次の表に示します。The following table describes common factors used to choose a message encoder. アプリケーションにとって重要な要因に優先順位を与えて、それらの要因に対して最適なメッセージ エンコーダーを選択します。Prioritize the factors that are important for your application, and then choose the message encoders that work best with these factors. この表には示されていないその他の要因と、アプリケーションで必要になることがあるカスタム メッセージ エンコーダーも考慮するようにしてください。Be sure to consider any additional factors not listed in this table and any custom message encoders that may be required in your application.

要因Factor 説明Description この要因をサポートするエンコーダーEncoders that support this factor
サポートされている文字セットSupported Character Sets TextMessageEncodingBindingElement MtomMessageEncodingBindingElement UTF8 と UTF16 Unicode のみのサポート (ビッグ エンディアンリトル エンディアン) エンコーディング。TextMessageEncodingBindingElement and MtomMessageEncodingBindingElement support only the UTF8 and UTF16 Unicode (big-endian and little-endian) encodings. UTF7 や ASCII など、別のエンコーディングが要求される場合はカスタム エンコーディングを使用する必要があります。If other encodings are required, such as UTF7 or ASCII, a custom encoder must be used. サンプルのカスタム エンコーダーでは、次を参照してください。カスタム メッセージ エンコーダーします。For a sample custom encoder, see Custom Message Encoder. テキストText
検査Inspection 検査は、転送中にメッセージを調べる機能です。Inspection is the ability to examine messages during transmission. SOAP の使用に関係なく、テキスト エンコーディングでは、多くのアプリケーションで特別なツールを使用することなくメッセージの検査と分析が可能です。Text encodings, either with or without the use of SOAP, allow messages to be inspected and analyzed by many applications without the use of specialized tools. メッセージまたはトランスポートのいずれかのレベルで転送セキュリティを使用すると、メッセージの検査機能に影響がある点に注意してください。Note that the use of transfer security, at either the message or transport level, affects your ability to inspect messages. 機密性はメッセージが検査されないように保護し、整合性はメッセージが変更されないように保護します。Confidentiality protects a message from being examined and integrity protects a message from being modified. テキストText
信頼性Reliability 信頼性は、転送エラーに対するエンコーダーの復元能力です。Reliability is the resiliency of an encoder to transmission errors. 信頼性はメッセージ層、トランスポート層、またはアプリケーション層でも提供できます。Reliability can also be provided at the message, transport, or application layer. すべての標準の WCF エンコーダーは、別のレイヤーが信頼性を提供するいると仮定します。All of the standard WCF encoders assume that another layer is providing reliability. エンコーダーは、転送エラーから回復する機能をほとんど備えていません。The encoder has little ability to recover from a transmission error. なしNone
単純さSimplicity 単純さは、エンコード仕様に対応するエンコーダーとデコーダーの作成の容易さを表します。Simplicity represents the ease with which you can create encoders and decoders for an encoding specification. テキスト エンコーディングは、単純さの面で特に優れており、POX テキスト エンコーディングは SOAP 処理のサポートが不要なため、さらに優れています。Text encodings are particularly advantageous for simplicity, and the POX text encoding has the additional advantage of not requiring support for processing SOAP. テキスト (POX)Text (POX)
サイズSize エンコーディングによって、コンテンツに課せられるオーバーヘッドの量が決まります。The encoding determines the amount of overhead imposed on content. エンコードされたメッセージのサイズは、サービス操作の最大スループットに直接影響します。The size of encoded messages is directly related to the maximum throughput of service operations. バイナリ エンコーディングは、一般にテキスト エンコーディングよりサイズが小さくなります。Binary encodings are generally more compact than text encodings. メッセージのサイズが優先事項である場合は、エンコーディング中にメッセージ コンテンツを圧縮することも検討してください。When message size is at a premium, consider also compressing the message contents during encoding. ただし、圧縮を行うとメッセージの送信者と受信者の両方で処理コストが大きくなります。However, compression adds processing costs for both the message sender and receiver. 2 項Binary
ストリームStreaming ストリーミングでは、アプリケーションはメッセージ全体が到着する前にメッセージの処理を開始できます。Streaming allows applications to begin processing a message before the entire message has arrived. ストリーミングを効果的に使用するには、受信するアプリケーションが重要なデータの到着を待つ必要をなくすために、メッセージの冒頭で重要なデータが利用可能になっている必要があります。Effectively using streaming requires that the important data for a message be available at the beginning of the message so that the receiving application is not required to wait for it to arrive. さらに、ストリーミングされた転送を使用するアプリケーションでは、メッセージ コンテンツに前方依存性がないように、メッセージ内のデータを順次編成していく必要があります。Moreover, applications that use streamed transfer must organize data in the message incrementally so that the content does not have forward dependencies. 多くの場合、コンテンツのストリーミングと必要最小限のサイズで転送を行うこととの間で妥協を図る必要があります。In many cases, you must compromise between streaming content and having the smallest possible transfer size for that content. なしNone
サードパーティ製ツールのサポート3rd Party Tool Support エンコーディングのサポート領域には、開発と診断があります。Support areas for an encoding include development and diagnosis. サードパーティの開発者は、POX 形式でエンコードされたメッセージを処理するためのライブラリとツールキットに多大な投資をしています。Third-party developers have made a large investment in libraries and toolkits for handling messages encoded in the POX format. テキスト (POX)Text (POX)
相互運用性Interoperability この要素は、WCF 以外のサービスとの相互運用する WCF のエンコーダーの機能を指します。This factor refers to the ability of a WCF encoder to interoperate with non-WCF services. テキストText

MTOM (部分的)MTOM (partial)

メモ:バイナリ エンコーダーを使用する場合、XMLReader を作成するときに IgnoreWhitespace の設定を使用して効果がありません。Note: When using the Binary Encoder, using the IgnoreWhitespace setting when creating a XMLReader will have no effect. たとえば、サービス操作内で次の操作を実行するとします。For example, if you do the following inside a service operation:

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 の設定は無視されます。The IgnoreWhitespace setting is ignored.

圧縮およびバイナリ エンコーダーCompression and the Binary Encoder

WCF 4.5 以降の WCF バイナリ エンコーダーでは、圧縮がサポートされます。Beginning with WCF 4.5 the WCF binary encoder adds support for compression. これにより、WCF クライアントから圧縮メッセージを送信するための gzip/deflate アルゴリズムを使用でき、さらに自己ホスト型 WCF サービスからの圧縮メッセージに応答することができます。This enables you to use the gzip/deflate algorithm for sending compressed messages from a WCF client and also respond with compressed messages from a self-hosted WCF service. この機能は、HTTP トランスポートおよび TCP トランスポートの両方で圧縮を有効にします。This feature enables compression on both the HTTP and TCP transports. IIS のホスト サーバーを構成することによって、いつでも IIS でホストされる WCF サービスを有効にして圧縮された応答を送信できます。An IIS hosted WCF service can always be enabled for sending compressed responses by configuring the IIS host server. 圧縮の種類は BinaryMessageEncodingBindingElement.CompressionFormat プロパティで構成されます。The type of compression is configured with the BinaryMessageEncodingBindingElement.CompressionFormat property. このプロパティは、いずれかの System.ServiceModel.Channels.CompressionFormat 列挙値に設定されます。This property is set to one of the System.ServiceModel.Channels.CompressionFormat enum values:

このプロパティは、binaryMessageEncodingBindingElement でのみ公開される、ため、次のような機能を使用するカスタム バインディングを作成する必要があります。Since this property is only exposed on the binaryMessageEncodingBindingElement, you will need to create a custom binding like the following to use this feature:

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

クライアントとサービスの両方を圧縮したメッセージを送受信することに同意する必要があり、したがって compressionFormat プロパティはクライアントとサービスの両方の binaryMessageEncoding 要素で構成する必要があります。Both the client and the service need to agree to send and receive compressed messages and therefore the compressionFormat property must be configured on the binaryMessageEncoding element on both client and service. サービスまたはクライアントの一方で圧縮が構成され、他方で圧縮が構成されていない場合は ProtocolException がスローされます。圧縮の有効化は慎重に考慮する必要があります。A ProtocolException is thrown if either the service or client is not configured for compression but the other side is.Enabling compression should be carefully considered. 圧縮は、ネットワーク帯域幅がボトルネックになっている場合に最も効果的です。Compression is mostly useful if network bandwidth is a bottleneck. CPU がボトルネックである場合、圧縮によりスループットが低下します。In the case where the CPU is the bottleneck, compression will decrease throughput. これがアプリケーションにとってメリットがあるかどうかを確認するために、適切なテストをシミュレートされた環境で行う必要があります。Appropriate testing must be done in a simulated environment to find out if this benefits the application

関連項目See also