2

コールバックを使用するWCFサービスにwsDualHttpBindingを使用することを計画しています。クライアントは、インターネットを介してサービスと通信するWindowsフォームアプリケーションになります。明らかに、私はクライアント側のファイアウォールを制御できないので、クライアント側でClientBaseAddressを設定する適切な方法は何でしょうか。

現在、最初のテストでは、サービスとクライアントを同じPCで実行しており、バインディングを次のように設定しています。

Dim binding As System.ServiceModel.WSDualHttpBinding = Struct.Endpoint.Binding
binding.ClientBaseAddress = New Uri("http://localhost:6667")

しかし、「localhost」はマシンアドレスに変換されず(NAT変換の心配ははるかに少ない)、そのポートがクライアントファイアウォールによってブロックされる可能性があるため、インターネット経由で展開する場合はこれが機能しないと感じています。

リモートクライアントへのコールバックのベースアドレスを処理する適切な方法は何ですか?

ClientBaseAddressを指定しない場合、WCFインフラストラクチャは、サービスからの着信接続に使用されるデフォルトのクライアントベースアドレスをポート80に作成します。ポート80は通常ファイアウォールに対して開かれているため、問題なく機能するはずです。

したがって、win form wcfクライアントアプリがいつ実行されるかを教えてください。「6667」のようなカスタムポートを開くにはどうすればよいですか。また、クライアント側のルーターからPCとファイアウォールに応答するために、どのライブラリまたはどのアプローチを使用する必要があるかを教えてください。何もブロックしません。この問題について、実際のシナリオで、人々が実際の生活でこの種の状況をどのように処理するかについて話し合ってください。ありがとう

4

1 に答える 1

4

適切な方法は、HTTPトランスポートの代わりにTCPトランスポートを使用することです。HTTPを介した二重通信には、2つのHTTP接続が必要です。1つはクライアントからサーバーに開かれ(これで問題ありません)、もう1つはサーバーからクライアントに開かれます。これは、両端を完全に制御できるシナリオでのみ機能します。次のように、使用するアドレスを推測するだけでは回避できない複雑さが多すぎます。

  • ローカルWindowsまたはサードパーティのファイアウォールを構成する必要があります
  • アプリケーションの実行許可-UACがオフになっているか、アプリケーションが管理者として実行されていない限り、HTTPでのリスニングはデフォルトでは許可されていません。netshまたはhttpcfg(Windows XPおよび2003)を介したポートでのリッスンを許可する必要があります。これも管理者権限が必要です。
  • ポートはすでに別のアプリケーションで使用できます。80の場合、IISなどの任意のローカルWebサーバーで使用できます。
  • プライベートネットワークとネットワークデバイス-クライアントマシンがNATの背後にある場合は、ポートフォワーディングを構成する必要がありますが、2台のマシンが同じプライベートネットワーク上でアプリケーションを実行している場合はどうなりますか?同じ着信ポートから2台のマシンに転送することはできません。

これらの問題はすべて、インフラストラクチャ全体を制御できる場合にのみ回避できます。これが、HTTP二重通信が主にイントラネットシナリオで役立つ理由です。たとえば、Silverlightは、2番目の接続が作成されず、代わりにサーバーを継続的にポーリングしてコールバックが利用可能かどうかを確認する別の実装を提供します。

TCPプロトコルはネイティブに二重であり、サーバーが同じ接続を介してクライアントにコールバックできるため、TCPトランスポートはクライアントからサーバーへの単一の接続のみを必要とします。公共サービスを展開する場合、通常はサーバー側のインフラストラクチャを制御できるため、構成に必要な変更を加えて機能させることができます。

これはあなたの前の質問にも答えると思います。

于 2013-01-07T11:54:28.857 に答える