各ポイントへの対処:
1、2。あなたのシナリオでは、デュプレックスサービスはやり過ぎだと思います。クライアントとサービスの両方が定期的に相互に通知し続ける必要がある場合、通常、デュプレックスサービスは便利です。データベースに大量のデータを出し入れすることは、二重通信を使用するための良いケース。デュプレックスでのストリーミングを許可しないことに関してnetTcpBinding
は、バイト配列を返すことができます(byte[]
)ストリームの代わりに。40 MBは大量ですが、ストリーミングがバイト配列を返すデュプレックスサービスよりもパフォーマンスが大幅に向上するとは限りません(各セットアップをテストして結果を比較するのはあなた次第です)。したがって、ここにはいくつかのオプションがあります。バイト配列をストリーミングして返さないでください(これはデュプレックスサービスで実行できます)。または、強力なケースがないように思われるため、サービスをデュプレックスにすることを忘れることができます。デュプレックスにしてストリームを返すだけです:
[OperationContract]
Stream RetrieveFile(long _fileId);
[OperationContract]
long SaveFile(Stream _stream);
3. netTcpBinding
HTTPバインディングよりもパフォーマンスがかなり優れていますが、価格が高くなります。これは主に、TCPポートがインターネットファイアウォールによってブロックされることがあるためです。インターネット経由で使用することはできますが、お勧めnetTcpBinding
しません。バインディングの選択は、クライアントがインターネット経由でサービスを利用する場合は、何をしようとしているかによって異なりますが(TCPポート、ファイアウォールなどのブロック)、クライアントがサービスを利用している場合はお勧めできません。同じネットワーク(LAN)内では、最も賢明な選択です。(ストリーミングをサポートしていません:@)デュプレックスサービス(Silverlightと同等)に固執する場合は良い選択です。デュプレックスサービスのアイデアを手放す場合は、他のHTTPベースのバインディングを使用することをお勧めします。netTcpBinding
netTcpBinding
wsDualHttpBinding
PollingDuplexHttpBinding
役立つ可能性のあるいくつかの記事、さまざまなWCFバインディングのパフォーマンス比較:
http://blog.shutupandcode.net/?p=1085
http://tomasz.janczuk.org/2010/03/comparison-of-http-polling-duplex-and.html
また、WCF over HTTPを使用した大規模なデータのストリーミングについて、著者によると、両方のサンプルが最大2GBのデータでテストされています。
http://garfoot.com/blog/2008/06/transferring-large-files-using-wcf/
http://www.codeproject.com/Articles/166763/WCF-Streaming-Upload-Download-Files-Over-HTTP
サービスにストリーミング転送を使用する必要がある、または使用する必要があると考えるべきではありません。スロットリングを有効にしていくつかのソケットレベルのプロパティを構成した後にのみ、HTTPバインディングよりもパフォーマンスが向上します。また、40 MBのストリーミングでは、バッファ転送よりもパフォーマンスが大幅に向上することはありません。したがって、多くのオプションと多くのトレードオフがあります。白黒で正しいか間違っているかはありません。ニーズに最も合うようにサービスをカスタマイズする方法が重要であり、ほとんどのソリューションが機能します。あなたのシナリオは非常に一般的なものであり、WCFでの大規模なデータ転送についてはオンラインでたくさんのことがあります。さらに調査を行ってください;)netTcpBinding
netTcpBinding