Подключение через интернет к службе WCF с использованием времени ожидания wsDualHttpBinding



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



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



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



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

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

1 ответ:

Существует реальная проблема с 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 обычно требует только изменения конфигурации - код остается прежним. Это просто, это быстро, это гораздо меньше хлопот и самое главное - это просто работает.

Comments

    Ничего не найдено.