WCF отправляет клиенту через брандмауэр?[закрыто]

StackOverflow https://stackoverflow.com/questions/22340

Вопрос

Смотрите также Как сервер WCF сообщает клиенту WCF об изменениях?(Лучшее решение, чем простой опрос, например,Комментарий или длинный опрос)

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

Требования:

  • WCF
  • Клиенты подключаются к серверу через TCP-порт 80 (netTcpBinding).
  • Сервер возвращает информацию через нерегулярные промежутки времени (от 1 минуты до нескольких часов).
  • Пользователям не нужно настраивать свои брандмауэры, запросы с сервера должны проходить через брандмауэры, у которых закрыты все входящие порты.Для этого необходим TCP-дуплекс на одном и том же соединении, двойная привязка не работает, так как порт должен быть открыт на клиентском брандмауэре.
  • Клиенты отправляют периодические сигналы на сервер через регулярные промежутки времени (возможно, каждые 15 минут), чтобы сервер знал, что клиент все еще жив.
  • Сервер — IIS7 с WAS.

Решением кажется дуплексный netTcpBinding.На основании этой информации:

WCF через брандмауэры и NAT

Сохранение соединений открытыми в IIS

Но мне еще предстоит найти пример кода, который работает..Я безуспешно пытался объединить образцы «Duplex» и «TcpActivation» из образцов Microsoft WCF.Пожалуйста, может кто-нибудь указать мне на пример кода, который работает, или создать небольшой пример приложения.Большое спасибо!

Это было полезно?

Решение

Я нашел пару решений:

ЗероС Лед GPL с коммерческой опцией.Только протестировал быстро.Выглядит мощнее, чем .NET Remoting, и очень активно развивается.

РемОбъекты Коммерческая, активная разработка, поддерживает все, но, похоже, не имеет всех более продвинутых функций, которые использует GenuineChannels.

Подлинные каналы.Он использует удаленное взаимодействие с множеством приятных дополнительных функций, наиболее важной из которых является работа через NAT без необходимости открывать клиентский брандмауэр.К сожалению, похоже, он очень мертв.

Другое решение — использовать потоковую передачу с IIS, согласно этой статье: Сохранение соединений открытыми в IIS

Клиент устанавливает первое соединение (http с IIS6, TCP с IIS7) к серверу через порт 80, затем соединение остается открытым с потоковым ответом, который никогда не заканчивается.

У меня не было времени экспериментировать с этим, и я не нашел примера, в котором бы говорилось, что это конкретно решает проблему брандмауэра, но вот отличный образец, который, вероятно, работает: Потоковая передача XML.

Другие советы

Вы пробовали смотреть: http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

Можете ли вы привести примеры того, что вы уже пробовали?Подробности о брандмауэрах и т. д., сообщения об ошибках?

Если и клиент, и сервер могут быть адресованы напрямую и брандмауэры не являются проблемой, рассматривали ли вы возможность разрешить клиентам регистрировать URL-адрес, обеспечивающий поддерживаемый контракт.Затем сервер может вызывать эту службу в любое время, без необходимости устанавливать длительное работающее (но в основном бездействующее) соединение, избегает необходимости биения сердца и может быть сделан устойчивым между сеансами\соединениями.

В большинстве настроек брандмауэра TCP-соединение будет разорвано брандмауэром, если оно простаивает, в целях экономии ресурсов.Тайм-аут простоя, вероятно, не является тем, чем вы можете управлять.Некоторые снесут их, если они простаивают и достигается предел ресурсов.

В большинстве корпоративных сред в любом случае никаким машинам не разрешается устанавливать исходящее TCP-соединение.

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

Если вам необходимо отправлять данные своевременно, за доли секунды (т.финансовые услуги), затем рассмотрите некоторую инфраструктуру обмена сообщениями, такую ​​как дистрибьютор NServiceBus на стороне клиента, но это потребует установки клиента...

Итак, вы пробовали использовать Торедо?Прочитав, что он там появится, пользователю может быть слишком сложно его настроить.

Я не пробовал сценарий, о котором вы говорите, поэтому не могу чем-то помочь, извините.Если все, что вам нужно обойти, это клиентский брандмауэр, вы можете проверить эта почта.

Удачи.

Вы пробовали это?ДуплексHttpBinding

Он использует технику интеллектуального опроса, инкапсулированную в специальную привязку WCF.Так что это должно работать из коробки.

Вы можете внести следующие изменения в клиенте для доступа к дуплексному веб-сервису на клиенте с поддержкой брандмауэра.

  • Установите флажок WebHttp в Брандмауэр -> Дополнительно -> Настройки (настройки сетевого подключения) -> Веб-сервер (Http).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top