Соединение через Интернет к службе WCF с использованием времени ожидания wsDualHttpBinding - PullRequest
6 голосов
/ 24 декабря 2010

Все еще на кривой обучения WCF:

Я настроил службу WCF с собственным размещением (WSDualHttpBinding), которая отлично работает на моем собственном компьютере, который находится за брандмауэром.Если я запускаю клиент на своем компьютере, все работает отлично.

Теперь я установил клиент на компьютер за пределами моей сети, и я пытаюсь получить доступ к службе через динамический DNS, например, так: http://mydomain.dyndns.org:8000/MyService.Мои проблемы с переадресацией портов были рассмотрены в предыдущем вопросе ;Теперь я вижу, что служба работает в моем браузере.

Но теперь, когда я пытаюсь запустить клиент на другом компьютере, я получаю следующее сообщение об ошибке: «Операция открытия не завершена в течение выделенного времени ожидания00:01:00. Время, отведенное для этой операции, могло быть частью более длительного времени ожидания. "

Я отключил защиту на службе, так что это не так.Что еще может препятствовать установлению соединения?

1 Ответ

29 голосов
/ 24 декабря 2010

Существует настоящая проблема с WSDualHttpBinding и тем, как большинство людей подключено к Интернету - быть за маршрутизатором означает, по крайней мере, с IPv4, что NAT разрушает вечеринку, как вы уже обнаружили.

При WSDualHttpBinding у вас есть два соединения: от клиента к серверу и от сервера к клиенту.

Обычно соединение клиент-сервер не имеет большого значения - этокак большая часть общения осуществляется через Интернет.В вашем случае кажется, что вы были за брандмауэром, и вы открыли / перенаправили необходимые порты.Но это не решает проблему второго соединения - от сервера к клиенту.В основном то, что происходит с этим вторым соединением, состоит в том, что клиент действует как сервер, а сервер действует как клиент.Поэтому вам нужно сделать одно и то же открытие / переадресацию портов с каждым клиентом, который подключается к вашему сервису, потому что он также действует как сервер!Это, конечно, необоснованное требование к каждому пользователю вашего сервиса.Вот почему WSDualHttpBinding больше подходит для межсерверных коммуникаций, где настройка является одноразовой.

Вместо того, чтобы пытаться заставить WSDualHttpBinding работать, я предлагаю вам переключиться на NetTcpBinding.Поскольку и WSDualHttpBinding, и NetTcpBinding предназначены только для WCF, только для Microsoft, проприетарных схем соединений, вы не сильно теряете в совместимости.С другой стороны, вы получаете много:

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

Переключение на NetTcpBinding обычно требует только изменения конфигурации - код остается прежним.Это просто, это быстро, это намного меньше хлопот и самое главное - это просто работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...