2008-08-22 3 views
7

Смотрите также How does a WCF server inform a WCF client about changes? (Better solution then simple polling, e.g. Coment or long polling)WCF кликнуть через брандмауэр?

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

Требования:

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

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

WCF through firewalls and NATs

Keeping connections open in IIS

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

+1

Вы встречая каких-либо исключений? Что именно это не работает? – jrista 2009-10-23 01:05:29

ответ

3

Я нашел несколько решений:

ZeroC Ice GPL с коммерческим вариантом. Быстро тестировали. Выглядит более мощно, чем .NET Remoting, и очень активно развивается.

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

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

Другим решением является использование потокового с IIS, согласно этой статье: Keeping connections open in IIS

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

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

+0

Вы должны быть очень осторожны при открытии соединений в IIS - вы можете запустить рабочие потоки (и быстро при этом). Я рекомендую вам прочитать IAsyncHttpHandler - и как получить ту же функциональность из WCF. В худшем случае вам придется опросить. – 2009-06-04 18:37:47

1

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

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

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

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

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

1

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

Удачи.

2

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

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

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

+0

Да, это не работает через межсетевой экран. – Sire 2009-06-04 17:45:33

1

Вы пробовали этот? DuplexHttpBinding

Используется метод интеллектуального опроса, инкапсулированный как пользовательская привязка WCF. Поэтому он должен работать из коробки.

-1

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

  • Set вариант WebHttp проверяется в брандмауэре -> Дополнительно -> Настройки (из сетевого подключения) -> Веб-сервер (HTTP)
+0

Внесение изменений в брандмауэр клиентов не является вариантом. И у них может быть аппаратный брандмауэр, и в этом случае он терпит неудачу. – Sire 2010-03-23 14:48:20

Смежные вопросы