メッセージ転送ストリーミング

Windows Communication Foundation (WCF) のトランスポートでは、メッセージを転送するための次の 2 つのモードをサポートしています。

  • バッファ転送では、転送が完了するまで、メッセージ全体がメモリ バッファに保持されます。受信側がメッセージを読み取るためには、バッファ内のメッセージが完全に配信される必要があります。
  • ストリーミング転送では、ストリームとしてメッセージが公開されます。受信側は、メッセージが完全に配信される前にメッセージの処理を開始できます。
  • ストリーミング転送では、大容量のメモリ バッファが不要なため、サービスのスケーラビリティを向上できます。転送モードを変更することによってスケーラビリティが向上するかどうかは、転送されるメッセージのサイズによって決まります。メッセージのサイズが大きい場合は、ストリーム転送の使用をお勧めします。

既定では、HTTP、TCP/IP、および名前付きパイプの各トランスポートはバッファ転送を使用します。ここでは、これらのトランスポートをバッファ転送モードからストリーミング転送モードに切り替える方法と、その結果について説明します。

ストリーミング転送の有効化

バッファ転送モードとストリーミング転送モードは、トランスポートのバインディング要素で切り替えます。バインディング要素には、TransferMode プロパティがあり、BufferedStreamedStreamedRequest、または StreamedResponse に設定できます。転送モードを Streamed に設定すると、両方向のストリーミング通信が可能になります。転送モードを StreamedRequest または StreamedResponse に設定すると、指定した方向のストリーミング通信だけが有効になります。

BasicHttpBindingNetTcpBinding、および NetNamedPipeBinding の各バインディングは、TransferMode プロパティを公開します。他のトランスポートの場合、転送モードを設定するにはカスタム バインディングを作成する必要があります。

バッファ転送とストリーミング転送のどちらを使用するかは、エンドポイントでローカルに決定します。HTTP トランスポートの場合、転送モードは、接続、つまりサーバーなどの中継局に伝達されません。転送モードの設定は、サービス インターフェイスの記述に反映されません。サービスに対してクライアント クラスを生成した後、ストリーミング転送で使用する予定のサービスの構成ファイルを編集し、転送モードを設定する必要があります。TCP トランスポートと名前付きパイプ トランスポートの場合、転送モードはポリシー アサーションとして伝達されます。

コード例については、「方法 : ストリーミングを有効にする」を参照してください。

ストリーミング転送の制限

ストリーミング転送モードを使用すると、ランタイムによって追加の制限が適用されます。

ストリーミングされたトランスポートで発生する操作は、最大で 1 つの入力パラメータまたは出力パラメータが指定されたコントラクトを持つことができます。設定するパラメータは、メッセージの本文全体に対応し、MessageStream の派生型、または IXmlSerializable 実装であることが必要です。操作の戻り値を取得することは、出力パラメータを取得することと同じです。

信頼できるメッセージング、トランザクション、SOAP メッセージ レベルのセキュリティなど、WCF の一部の機能は転送メッセージのバッファ処理に依存しています。これらの機能を使用すると、ストリーミングによって得られるパフォーマンス上の利点が減少したり、失われたりする可能性があります。ストリーミングされたトランスポートをセキュリティで保護する場合は、トランスポート レベルのセキュリティだけを使用するか、または、トランスポート レベルのセキュリティと認証のみのメッセージ セキュリティを組み合わせて使用してください。

SOAP ヘッダーは、転送モードがストリーミングに設定されている場合でも、必ずバッファされます。メッセージのヘッダーが MaxBufferSize トランスポート クォータのサイズを超えないようにしてください。この設定詳細については、 、「トランスポート クォータ」を参照してください。

バッファ転送とストリーミング転送の違い

転送モードをバッファからストリーミングに変更すると、TCP トランスポートと名前付きパイプ トランスポートのネイティブなチャネル形状も変更されます。バッファ転送では、ネイティブなチャネル形状は IDuplexSessionChannel です。ストリーム転送では、ネイティブなチャネル形状は IRequestChannelIReplyChannel です。これらのトランスポートを直接 (つまり、サービス コントラクトを介さずに) 使用する既存のアプリケーションで転送モードを変更するには、チャネル ファクトリおよびリスナの予測されるチャネル形状を変更する必要があります。

関連項目

タスク

方法 : ストリーミングを有効にする