Подключение через интернет к службе WCF с использованием времени ожидания wsDualHttpBinding
Все еще на кривой обучения WCF:
Я настроил автономную службу WCF (WSDualHttpBinding), которая прекрасно работает на моем собственном компьютере, который находится за брандмауэром. Если я запускаю клиент на своем собственном компьютере, все работает отлично.
Теперь я установил клиент на компьютер вне моей сети, и я пытаюсь получить доступ к службе через динамический DNS, например: http://mydomain.dyndns.org:8000/MyService. Мои проблемы с переадресацией портов были рассмотрены в предыдущем вопросе ; Теперь я могу видеть сервис находится в моем браузере.
Но теперь, когда я пытаюсь запустить клиент на другой машине, я получаю следующее сообщение об ошибке: "операция открытия не была завершена в течение отведенного времени ожидания 00:01:00. Время, отведенное на эту операцию, возможно, было частью более длительного таймаута."
Я отключил безопасность на службе, так что это не так. Что еще может помешать этой связи произойти?
1 ответ:
Существует реальная проблема с
WSDualHttpBindingи способом, которым большинство людей подключено к интернету - быть за маршрутизатором означает, по крайней мере, с IPv4, что NAT разрушает партию, как вы уже обнаружили.С помощью
WSDualHttpBindingу вас есть два соединения: от клиента к серверу и от сервера к клиенту.Обычно соединение клиент-сервер не имеет большого значения-именно так осуществляется большинство коммуникаций через интернет. В вашем случае, похоже, что вы стояли за брандмауэр, и вы открыли / перенаправили необходимые порты. Но это не решает проблему второго соединения-от сервера к клиенту. В основном, то, что происходит с этим вторым соединением, заключается в том, что клиент действует как сервер, а сервер действует как клиент. Таким образом, вам нужно сделать то же самое открытие/перенаправление портов с каждым клиентом, который подключается к вашему сервису, потому что он также действует как сервер! Это, конечно, необоснованное требование к каждому пользователю вашего сервиса. Это почему
Вместо того чтобы пытаться заставитьWSDualHttpBindingбольше подходит для межсерверных коммуникаций, где настройка является одноразовым делом.WSDualHttpBindingработать, я предлагаю вам переключиться наNetTcpBinding. Поскольку иWSDualHttpBinding, иNetTcpBindingявляются только WCF, только Microsoft, проприетарными схемами подключения, вы не теряете много в плане совместимости. С другой стороны, вы получаете очень много:
- Протокол связи является двоичным и более компактным, чем обычный текстовый XML, используемый в
NetTcpBindingиспользует только одно соединение, от клиента к серверу, позволяя при этом двустороннее коммуникация типаWSDualHttpBinding. Таким образом, нет необходимости иметь дело с открытием/переадресацией портов на стороне клиента - NAT не является проблемой.WSDualHttpBinding. Меньшая передача данных означает лучшую производительность сервиса.- С помощью
NetTcpBindingВы можете получать мгновенное уведомление о том, когда клиент отключается, так как сокет закрыт. Нет необходимости ждать таймаута HTTP, как вы делаете сWSDualHttpBinding.- одно соединение означает там нет ничего, что может выйти из синхронизации-с
WSDualHttpBinding, одно из двух соединений может упасть, в то время как другое может все еще быть активным, имея только один способ связи. WCF имеет способ справиться с этим, но лучше просто избегать этой проблемы в первую очередь.Переключение на
NetTcpBindingобычно требует только изменения конфигурации - код остается прежним. Это просто, это быстро, это гораздо меньше хлопот и самое главное - это просто работает.
Comments