5

二重契約では、サービスがクライアントにメッセージを送信できることは知っていますが、それが本当に役立つのはいつかを知りたいと思います。

データベースからデータを取得したり、データを挿入したりするリクエストをサービスに送信する一般的なアプリケーションがあります。また、データベースに約40MBのファイルを保存する必要があるため、優れたパフォーマンスが必要です。このため、転送モードがストリーミングされたnet.tcpバインディングを使用したいのですが、問題は、net.tcpデュプレックスサービスがストリーミング転送モードを使用できないことです。

だから私はいくつかの選択肢があると思います。

1.-この種のアプリケーションに二重契約が本当に必要かどうかを調べます。たとえば、チャットアプリケーションでは、連絡先が接続されたときにサーバーがクライアントに通知する必要があるため、二重契約の方が意味があります。ただし、データベースにアクセスする一般的なクライアントでは、二重契約?どのような操作で二重契約が必要になる可能性がありますか?

2.-他のオプションは、デュプレックスコントラクトを持たないが、サーバーでデュプレックスコントラクトを実装せず、クライアントで他のシングルコントラクトを実装するため、クライアントがサービスに接続すると、サービスは接続に必要な情報を受け取ります。クライアントのサービス。しかし、これは二重契約を回避するための良い方法ですか?

3.-本当に私のアプリケーションでは、ストリーミング転送モードを許可するデュプレックスHTTPの代わりにtcpが必要ですか?パフォーマンスの観点から、HTTPに対するtcpの利点は何ですか?

ありがとう。

4

2 に答える 2

7

コールバックパターンを実装する場合は、デュプレックスが必要です。コールバックとは、サーバーでイベントがいつ発生したかをクライアントが知らないことを意味します。

イベントがいつ発生するかわからない場合は、次の2つのオプションを実装できます。

  1. ポーリング-イベントが発生したかどうかを確認するために、X分ごとにリクエストを送信します。サーバーは、イベントの詳細(発生した場合)を返すか、呼び出しを続行する必要があることを示すフラグを返す必要があります。サーバーは、高度なシナリオで推奨されるタイムアウトを返すこともできます。
  2. コールバック-クライアントは、イベントが発生した場合にサーバーが実行する必要がある何らかの形式の説明を送信します。これは、Cの関数、.NETのデリゲート、またはWCFのエンドポイントスキーマへのポインターである可能性があります。サーバーはその情報を記憶し、時が来たときに彼らの側から電話をかけます。

ご覧のとおり、デュプレックス/コールバックは、ある時点でサーバーがクライアントとして機能(通信を開始)することを意味し、これは大きなゲームの変化です。

多くの場合、ネットワークでは外部サービスを呼び出すことができますが(クライアントとして機能します)、外部リソースからは呼び出せません(外部サービスはクライアントとして機能します)ため、WCF二重通信では特別なネットワーク構成が必要になる場合があります。これはセキュリティの目的で実装されています。

質問に戻る:

  1. 大量のデータをダウンロードするだけでよい場合は、デュプレックスは必要ありません。サーバーで発生した更新をキャッチしてクライアントに通知する場合に必要になることがあります。チャットでは、他の人によって導入された変更についてクライアントに通知する必要があるシナリオが多数あるため、デュプレックスはチャットで機能するはずです。
  2. あなたが説明したのは、デュプレックスチャネルの手作りのバリエーションです。サーバーにメソッドを呼び出させたい場合は、MSによって作成された実証済みのテスト済みデュプレックス実装を使用する必要があります。それ以外の場合、オプションはポーリングです。
  3. そうです、大量のデータを処理するには、tcp+ストリーミング転送モードが必要です。TCPは、テキストのシリアル化と比較してよりコンパクトなバイナリシリアル化を使用します。+ TCPでは、HTTPヘッダーやSOAPエンベロープを送信する必要はありません。不要な場合はセキュリティを無効にしてください。パフォーマンスに大きな影響を与えます。
于 2012-06-25T17:05:13.863 に答える
5

各ポイントへの対処:

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ベースのバインディングを使用することをお勧めします。netTcpBindingnetTcpBindingwsDualHttpBindingPollingDuplexHttpBinding

役立つ可能性のあるいくつかの記事、さまざまな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での大規模なデータ転送についてはオンラインでたくさんのことがあります。さらに調査を行ってください;)netTcpBindingnetTcpBinding

于 2012-06-25T16:59:40.090 に答える