wsDualHttpBinding не работает вне сети с клиентом WPF
Я пытался реализовать DuplexCommunication между WPF и WCF, связь работает хорошо при внутреннем тестировании, в сети, когда мы пытались получить доступ к этой внешней сети после публикации ее снаружи, мы можем получить доступ к службе через веб-браузер, но клиент 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>
Я попытался дать 'baseAddresses' и 'identity' со значением dns на стороне сервера, также попытался дать clientBaseAddress на стороне клиента, но все же он не будет работать вне сети.
всегда возникает ошибка тайм-аута при попытке открыть дуплексное соединение из приложения WPF: Ошибка: "Операция открытия не завершена в течение выделенного времени ожидания 00:00:09.4911018. Время, отведенное для этой операции, могло быть частью более длительного времени ожидания ".
Я думаю, что что-то не так в части конфигурации, но не уверен, что это, любая помощь по этому вопросу высоко ценится.
Благодарю.
2 ответа
WsDualHttpBinding не подходит для пересечения брандмауэров - он требует, чтобы сервер открыл соединение с клиентом, по умолчанию на случайном адресе на порту 80. Используемый порт может быть настроен clientBaseAddress на привязке, но все же требует, чтобы межсетевой экран разрешил входящие соединения что, как вы надеетесь, помешают сетевые администраторы. Если вы хотите выполнить дуплексную работу в WCF, вам следует использовать NetTcpBinding, который использует одно исходящее соединение, а обратные вызовы выполняются через это соединение.
Я писал об этом здесь
Открыт ли порт 80 на клиенте для приема входящих соединений, и правильно ли порт перенаправлен через любые маршрутизаторы NAT? Двойные HTTP-привязки требуют, чтобы сервер имел возможность открыть второе HTTP-соединение с клиентом и в Интернете (вне локальной сети), который почти всегда дает сбой из-за брандмауэров и домашних маршрутизаторов.