方法 : ストリーミングを有効にする
Windows Communication Foundation (WCF) では、バッファ転送またはストリーミング転送を使用してメッセージを送信できます。既定のバッファ転送モードでは、受信側がメッセージを読み取る前に、メッセージの送信が完了している必要があります。ストリーミング転送モードでは、送信が完了していなくても、受信側でメッセージの処理を開始できます。ストリーミング モードは、渡される情報が長い場合、または連続的に処理する場合に役立ちます。ストリーミング モードは、メッセージが大きすぎてすべてをバッファできない場合にも役立ちます。
ストリーミングを有効にするには、OperationContract を適切に定義し、トランスポート レベルでストリーミングを有効にします。
データをストリーミングするには
データをストリーミングするには、サービスの OperationContract が次の 2 つの要件を満たしている必要があります。
- ストリーミングするデータを保持するパラメータが、メソッド内の唯一のパラメータになるようにします。たとえば、入力メッセージをストリーミングする場合、厳密に 1 つの入力パラメータが操作に含まれている必要があります。同様に、出力メッセージをストリーミングする場合、厳密に 1 つの出力パラメータまたは戻り値が操作に含まれている必要があります。
- パラメータおよび戻り値の型の少なくとも 1 つが、Stream、Message または IXmlSerializable になる必要があります。
ストリーミングされたデータのコントラクトの例を次に示します。
GetStream
操作は、バッファされた入力データをstring
として受信し、ストリーミングされたStream
を返します。逆に言えば、UploadStream
はStream
(ストリーミング) を取り込んで、bool
(バッファ) を返します。EchoStream
はStream
を出し入れします。これは、入力および出力メッセージがどちらもストリーミングされる操作の例です。最後に、GetReversedStream
は入力を行わずにStream
(ストリーミング) を返します。バインディングではストリーミングを有効にする必要があります。TransferMode プロパティを次の値のいずれかに設定します。
- Buffered,
- Streamed (両方向のストリーミング通信を有効にする)。
- StreamedRequest (要求に対してのみストリーミングを有効にする)。
- StreamedResponse (応答に対してのみストリーミングを有効にする)。
BasicHttpBinding は、バインディングの TransferMode プロパティを公開し、NetTcpBinding と NetNamedPipeBinding も公開します。TransferMode プロパティをトランスポート バインディング要素に設定し、カスタム バインディングで使用することもできます。
次のサンプルは、コードで TransferMode を設定する方法と、構成ファイルを変更して設定する方法を示しています。どちらのサンプルも、受信可能なメッセージの最大サイズを決定する
maxReceivedMessageSize
プロパティを 64 MB に設定します。既定のmaxReceivedMessageSize
は 64 KB です。これは、多くの場合ストリーミングを行うには小さすぎます。アプリケーションでの受信が予想されるメッセージ最大サイズに応じて、このクォータ設定を適切に変更してください。また、maxBufferSize によりバッファの最大サイズが決定されるので、適切に設定してください。- 次のサンプルの構成スニペットでは、basicHttpBinding とカスタム HTTP バインディングで、TransferMode プロパティをストリーミングに設定しています。
- 次のコード スニペットでは、basicHttpBinding とカスタム HTTP バインディングで、TransferMode プロパティをストリーミングに設定しています。
- 次のコード スニペットでは、カスタム TCP バインディングで、TransferMode プロパティをストリーミングに設定しています。
GetStream
、UploadStream
、およびEchoStream
の各操作では、ファイルからデータを直接送信したり、受信したデータを直接ファイルに保存します。次のコードは、GetStream
の例です。
カスタム ストリームの書き込み
送受信中のデータ ストリームの各チャンクに対して特殊な処理を行うには、Stream からカスタム ストリーム クラスを派生します。カスタム ストリームの例として、
GetReversedStream
メソッドとReverseStream
クラスのコードを次に示します。GetReversedStream
では、ReverseStream
の新しいインスタンスを作成して返します。実際の処理は、システムがReverseStream
オブジェクトの読み取りを行うときに発生します。ReverseStream.Read
メソッドは、基になるファイルからバイトのチャンクを読み取り、バイトを反転し、その反転したバイトを返します。このメソッドは、ファイル全体の内容を反転しません。一度に 1 つのバイト チャンクを反転します。この例では、ストリームの内容の読み取りやストリームへの書き込み時に、ストリーミング処理を実行する方法を示します。