Существует настоящая проблема с WSDualHttpBinding
и тем, как большинство людей подключено к Интернету - быть за маршрутизатором означает, по крайней мере, с IPv4, что NAT разрушает вечеринку, как вы уже обнаружили.
При WSDualHttpBinding
у вас есть два соединения: от клиента к серверу и от сервера к клиенту.
Обычно соединение клиент-сервер не имеет большого значения - этокак большая часть общения осуществляется через Интернет.В вашем случае кажется, что вы были за брандмауэром, и вы открыли / перенаправили необходимые порты.Но это не решает проблему второго соединения - от сервера к клиенту.В основном то, что происходит с этим вторым соединением, состоит в том, что клиент действует как сервер, а сервер действует как клиент.Поэтому вам нужно сделать одно и то же открытие / переадресацию портов с каждым клиентом, который подключается к вашему сервису, потому что он также действует как сервер!Это, конечно, необоснованное требование к каждому пользователю вашего сервиса.Вот почему WSDualHttpBinding
больше подходит для межсерверных коммуникаций, где настройка является одноразовой.
Вместо того, чтобы пытаться заставить WSDualHttpBinding
работать, я предлагаю вам переключиться на NetTcpBinding
.Поскольку и WSDualHttpBinding
, и NetTcpBinding
предназначены только для WCF, только для Microsoft, проприетарных схем соединений, вы не сильно теряете в совместимости.С другой стороны, вы получаете много:
NetTcpBinding
использует только одно соединение, от клиента к серверу, в то же время позволяя двустороннюю связь, такую как WSDualHttpBinding
.Таким образом, нет необходимости иметь дело с открытием / переадресацией портов на стороне клиента - NAT не является проблемой. - Протокол связи является двоичным и более компактным, чем простой текстовый XML, используемый в
WSDualHttpBinding
.Меньшая передача данных означает более эффективную службу. - С помощью
NetTcpBinding
вы можете получить мгновенное уведомление о том, когда клиент отключается, так как сокет закрыт.Не нужно ждать тайм-аута HTTP, как вы делаете с WSDualHttpBinding
. - Одно соединение означает, что нет ничего, что может выйти из синхронизации - с
WSDualHttpBinding
, одно из двух соединений может прерваться, а другоеможет все еще быть активным, имея только одностороннюю связь.У WCF есть способ справиться с этим, но лучше всего сначала избежать этой проблемы.
Переключение на NetTcpBinding
обычно требует только изменения конфигурации - код остается прежним.Это просто, это быстро, это намного меньше хлопот и самое главное - это просто работает.