次の方法で共有


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

Windows Communication Foundation (WCF) では、バッファ転送またはストリーミング転送を使用してメッセージを送信できます。既定のバッファ転送モードでは、受信側がメッセージを読み取る前に、メッセージの送信が完了している必要があります。ストリーミング転送モードでは、送信が完了していなくても、受信側でメッセージの処理を開始できます。ストリーミング モードは、渡される情報が長い場合、または連続的に処理する場合に役立ちます。ストリーミング モードは、メッセージが大きすぎてすべてをバッファできない場合にも役立ちます。

ストリーミングを有効にするには、OperationContract を適切に定義し、トランスポート レベルでストリーミングを有効にします。

データをストリーミングするには

  1. データをストリーミングするには、サービスの OperationContract が次の 2 つの要件を満たしている必要があります。

    1. ストリーミングするデータを保持するパラメータが、メソッド内の唯一のパラメータになるようにします。たとえば、入力メッセージをストリーミングする場合、厳密に 1 つの入力パラメータが操作に含まれている必要があります。同様に、出力メッセージをストリーミングする場合、厳密に 1 つの出力パラメータまたは戻り値が操作に含まれている必要があります。
    2. パラメータおよび戻り値の型の少なくとも 1 つが、StreamMessage または IXmlSerializable になる必要があります。

    ストリーミングされたデータのコントラクトの例を次に示します。

    GetStream 操作は、バッファされた入力データを string として受信し、ストリーミングされた Stream を返します。逆に言えば、UploadStreamStream (ストリーミング) を取り込んで、bool (バッファ) を返します。EchoStreamStream を出し入れします。これは、入力および出力メッセージがどちらもストリーミングされる操作の例です。最後に、GetReversedStream は入力を行わずに Stream (ストリーミング) を返します。

  2. バインディングではストリーミングを有効にする必要があります。TransferMode プロパティを次の値のいずれかに設定します。

    1. Buffered,
    2. Streamed (両方向のストリーミング通信を有効にする)。
    3. StreamedRequest (要求に対してのみストリーミングを有効にする)。
    4. StreamedResponse (応答に対してのみストリーミングを有効にする)。

    BasicHttpBinding は、バインディングの TransferMode プロパティを公開し、NetTcpBindingNetNamedPipeBinding も公開します。TransferMode プロパティをトランスポート バインディング要素に設定し、カスタム バインディングで使用することもできます。

    次のサンプルは、コードで TransferMode を設定する方法と、構成ファイルを変更して設定する方法を示しています。どちらのサンプルも、受信可能なメッセージの最大サイズを決定する maxReceivedMessageSize プロパティを 64 MB に設定します。既定の maxReceivedMessageSize は 64 KB です。これは、多くの場合ストリーミングを行うには小さすぎます。アプリケーションでの受信が予想されるメッセージ最大サイズに応じて、このクォータ設定を適切に変更してください。また、maxBufferSize によりバッファの最大サイズが決定されるので、適切に設定してください。

    1. 次のサンプルの構成スニペットでは、basicHttpBinding とカスタム HTTP バインディングで、TransferMode プロパティをストリーミングに設定しています。
    2. 次のコード スニペットでは、basicHttpBinding とカスタム HTTP バインディングで、TransferMode プロパティをストリーミングに設定しています。
    3. 次のコード スニペットでは、カスタム TCP バインディングで、TransferMode プロパティをストリーミングに設定しています。
  3. GetStreamUploadStream、および EchoStream の各操作では、ファイルからデータを直接送信したり、受信したデータを直接ファイルに保存します。次のコードは、GetStream の例です。

カスタム ストリームの書き込み

  1. 送受信中のデータ ストリームの各チャンクに対して特殊な処理を行うには、Stream からカスタム ストリーム クラスを派生します。カスタム ストリームの例として、GetReversedStream メソッドと ReverseStream クラスのコードを次に示します。

    GetReversedStream では、ReverseStream の新しいインスタンスを作成して返します。実際の処理は、システムが ReverseStream オブジェクトの読み取りを行うときに発生します。ReverseStream.Read メソッドは、基になるファイルからバイトのチャンクを読み取り、バイトを反転し、その反転したバイトを返します。このメソッドは、ファイル全体の内容を反転しません。一度に 1 つのバイト チャンクを反転します。この例では、ストリームの内容の読み取りやストリームへの書き込み時に、ストリーミング処理を実行する方法を示します。

関連項目

概念

大規模データとストリーミング

その他の技術情報

Service Contract: Stream