web-dev-qa-db-ja.com

サーバーとクライアント間の双方向通信

状況:サーバー上で実行されているWebアプリケーションがあります。このアプリケーションは、別のネットワーク上にある他のPC(クライアント)からデータをフェッチする必要があります。

クライアントのPCでは、ローカルのSQLデータベースを使用してWindowsサービスでホストされているWCFがあります。サーバーとクライアント間でデータを共有するために二重通信を行いたい。データ共有とは、クライアントとサーバー間でデータテーブル、データセット、文字列などを共有することを意味します。

問題:

1)ファイアウォール、プロキシ、NAT=クライアント側のPCを制御できません。ほとんどの企業の従業員PCには、ファイアウォールがICMPトラフィックをブロックするなど、多くのネットワークセキュリティがあります。一部のポートも、一部のルーターはポート転送などが無効になっている可能性があります。クライアントはネットワークの場所を変更できます。ただし、クライアント側のルーター、プロキシ、ファイアウォールで設定を行いたくありません。通信中に、この種の問題を処理するにはご存じのとおり、スカイプはその状況で完璧に機能しています。

ファイアウォールは、クライアントへのインバウンド接続を非常に頻繁にブロックします。クライアントがサーバーから到達できない可能性があります。ルーターの背後でNAT変換を使用している可能性があるため、ルーターでポート転送が設定されていて、一部の新しいルーターでポート転送が無効になっている場合は接続できません。

2)クライアント側にはIISはありません。

クライアントPCでリモートアクセスを許可したくありません。

100を超えるクライアントがあり、サーバーは1つだけです。 1つのサーバーが、異なるネットワーク上の多くのクライアントと通信する必要があります。

クライアントアプリケーションがウィンドウアプリケーションを使用している一方の側とウィンドウサービスでホストされているwcf、サーバーの反対側がWebアプリケーションを使用しています。つまり、平均的なコミュニケーションはデスクトップPCとWeb PCの間で行われるということです。

両方がWebアプリケーションを使用している場合、双方向通信を行うことは問題ではありませんでした。

すでにテストして問題を見つけたテクノロジー

WSDualHttpBinding:クライアントがNATの背後にある場合は機能しません。

MSMQ:クライアントが2つ以上ある場合の悪い手法と、その使用RAMメモリ。

Xsocket: ICMPトラフィックがクライアントのファイアウォールによってブロックされている場合も機能しません。

WebRTC:正常に機能しますが、WebからWebへの通信がサポートされています。クライアント側にWindowsアプリがあります。

Socket.io: node.jsやその他多くの設定が必要ですが、既存のアプリケーションに実装する必要があるため、実装が難しく、新しいアプリケーションを作成していません。

C#ソケットプログラム:クライアントとサーバーが異なるネットワーク上にある場合は機能しません。

Service Busリレー:テストでも無料ではありません。

socketPro:私はそれを調べて調べましたが、Googleで適切なサンプルが見つからないため、テストできませんでした。

Genuine Channels: googleでサンプルが見つかりません。

SignalRの問題を確認しましょう。:サーバー側でコンソールアプリケーションを実行し、クライアント側で2つのアプリケーションを実行します。1つはコンソールと他のWebです。サーバーとの接続を開始するときよりもコンソールクライアントアプリケーションを実行しているときは、Webクライアントアプリケーションを使用しているときは問題なく動作していました。なぜこれが理解できないのですか?

この状況を処理する最も安全で迅速な方法は何ですか?どのアプローチを使用すればよいですか?

ありがとうアドバンス。

3
Tariq_ASp.net

これは、WCF CallBackコントラクトを使用して実行できます。

クライアントがサーバーに接続できる場合、サーバーはcallback構成でWCFサービスを使用できます。これは、サーバーがクライアントがサービス(コールバックサービス)もサービスコントラクトの一部として実装することを期待していることを示しています。

これは次のように壊れています。

  1. サーバーはWCFサービスをホストします。
  2. サービスコントラクトにはCallBackContract属性があります。

    [ServiceContract(CallbackContract = typeof(IMyServiceCallback))]

  3. このサービスを使用するクライアントは、サーバーと通信できるように、必要なコールバックコントラクト(サービス)を実装する必要があります。

  4. クライアントがサーバー側サービスに接続すると、同じ接続を介してリバース/コールバック接続が行われます。

コールバックの使用は、同じ接続(すでに開かれている)を介して行われます。これには、双方向通信チャネルが必要です(たとえば、http)。

これを実装する方法の例については、 http://adamprescott.net/2012/08/15/a-simple-wcf-service-callback-example/ を参照してください。

1
oɔɯǝɹ