WCF отправляет клиенту через брандмауэр?[закрыто]
Вопрос
Смотрите также Как сервер WCF сообщает клиенту WCF об изменениях?(Лучшее решение, чем простой опрос, например,Комментарий или длинный опрос)
Мне нужно использовать технологию push-уведомлений с WCF через клиентские брандмауэры.Должно быть, это распространенная проблема, и я точно знаю, что теоретически она работает (см. ссылки ниже), но мне не удалось заставить ее работать, и я не смог найти пример кода, демонстрирующий это.
Требования:
- WCF
- Клиенты подключаются к серверу через TCP-порт 80 (netTcpBinding).
- Сервер возвращает информацию через нерегулярные промежутки времени (от 1 минуты до нескольких часов).
- Пользователям не нужно настраивать свои брандмауэры, запросы с сервера должны проходить через брандмауэры, у которых закрыты все входящие порты.Для этого необходим TCP-дуплекс на одном и том же соединении, двойная привязка не работает, так как порт должен быть открыт на клиентском брандмауэре.
- Клиенты отправляют периодические сигналы на сервер через регулярные промежутки времени (возможно, каждые 15 минут), чтобы сервер знал, что клиент все еще жив.
- Сервер — IIS7 с WAS.
Решением кажется дуплексный netTcpBinding.На основании этой информации:
Сохранение соединений открытыми в 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).