1

私は WPF と WCF の間に DuplexCommunication を実装しようとしていましたが、ネットワーク内で内部的にテストすると通信がうまく機能し、外部に公開した後にこの外部ネットワークにアクセスしようとすると、Web ブラウザーを介してサービスにアクセスできます。しかし、接続を開こうとすると、WPF クライアントがエラーを出しています。以下は、サーバー側とクライアント側の両方の構成です。サーバ:

  <wsDualHttpBinding>
    <binding closeTimeout="00:01:00"
                   openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                   bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                   maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                   messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" />
      <security mode="None" />
    </binding>
  </wsDualHttpBinding>

  <service behaviorConfiguration="DuplexServices.DuplexServiceBehavior" name="DuplexServices.DuplexService">
    <endpoint address="dual" binding="wsDualHttpBinding" contract="DuplexServices.IDuplexService" >
     </endpoint>
   </service>

クライアント:

<wsDualHttpBinding>
            <binding name="WSDualHttpBinding_DuplexService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" >
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                <security mode="None">
                </security>
            </binding>
        </wsDualHttpBinding>

     <client>
    <endpoint address="http://XXX.com/DuplexServices/DuplexService.svc/dual"
            binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_DuplexService"
            contract="DuplexServiceeReference.DuplexService" name="WSDualHttpBinding_DuplexService">
                    </endpoint>
     </client>

サーバー側でdns値を使用して「baseAddresses」と「identity」を指定しようとしましたが、クライアント側でもclientBaseAddressを指定しようとしましたが、それでもネットワーク外では機能しません。

WPF アプリケーションから二重接続を開こうとすると、常にタイムアウト エラーが発生する: エラー: 「00:00:09.4911018 の割り当てられたタイムアウト内で、開く操作が完了しませんでした。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。 ."

構成部分に何か問題があると思いますが、それが何であるかはわかりません。これに関するヘルプは大歓迎です。

ありがとう。

4

2 に答える 2

4

WsDualHttpBinding は、ファイアウォールの通過には適していません。デフォルトでは、ポート 80 のランダム アドレスで、サーバーがクライアントへの接続を開く必要があります。使用されるポートは、バインディングの clientBaseAddress によって構成できますが、受信接続を許可するためにファイアウォールが必要です。これは、ネットワーク管理者が防止することを願っています。WCF で双方向の作業を行う場合は、単一の送信接続を使用する NetTcpBinding を使用する必要があり、コールバックはこの接続を介して実行されます。

私はこれについてここでブログを書きました

于 2011-06-18T06:54:23.890 に答える
1

クライアントでポート 80 が開いて着信接続を受け入れ、NAT ルーターを介して適切にポート転送されていますか? デュアル HTTP バインディングでは、サーバーがクライアントへの 2 番目の HTTP 接続を開くことができる必要があり、インターネット上 (LAN の外) では、ファイアウォールとホーム ルーターが原因でほとんどの場合失敗します。

于 2011-04-30T17:51:02.640 に答える