WCF двусторонняя HTTP-связь для обхода брандмауэров - PullRequest
2 голосов
/ 23 августа 2009

Я хочу использовать WCF для включения двусторонней связи без открытия порта на клиенте.

Я разрабатываю что-то вроде приложения P2P (аналогично teamviewer / logmein), в котором вам не нужно открывать порты для связи.

Как мне выполнить двустороннюю связь через HTTP / HTTPS без необходимости открывать порт в клиенте?

Примечание: порт 80 может быть открыт на сервере ... никаких проблем на этом.

Спасибо

Ответы [ 2 ]

5 голосов
/ 23 августа 2009

Хорошо, упомянутые вами системы работают следующим образом. Сначала они пытаются заставить клиента A и клиента B взаимодействовать напрямую через ряд различных топологий, которые, в основном, требуют, чтобы одна из них разрешала входящие соединения, в случае неудачи они обращаются к третьей стороне, которая действует как человек посередине. Таким образом, клиент A обращается к серверу и отправляет ему сообщения для клиента B. Затем клиент A получает в ответ сообщения, адресованные ему. Клиент B отправляет ему сообщения на сервер, и он получает сообщение от клиента A обратно с сервера. Таким образом, и клиент A, и B всегда инициируют соединение и не нуждаются в открытом порту для входящего трафика.

Если я правильно понимаю, в вашем случае вы бы всегда хотели, чтобы человек посередине. Для этого вам нужно написать сервис WCF, который предоставляет все соответствующие методы. Например, такие вещи, как

  • void SendMessageToClient (идентификатор отправителя, идентификатор получателя, сообщение сообщения)
  • Сообщение [] GetMessages (Guid receientId)

затем эти методы соответственно сохраняют и извлекают эти объекты сообщения откуда-то (например, из базы данных, очереди или чего-то в этом роде).

Затем напишите клиент, который подключается к службе WCF, используя HTTP-привязку, и вызовите методы на сервере и обработайте результаты.

Надеюсь, вы понимаете, что

  • а) это не очень эффективный способ общения.
  • b) , что сложно тестировать, отлаживать и понимать, что происходит, так как вовлечено так много сторон, и связь асинхронна, живя в 3 разных процессах.
  • в) он добавляет дополнительный уровень поверх связи, поэтому вам нужно держать его в голове (и предпочтительно в коде), когда вы имеете дело с битами инфраструктуры и когда вы Имея дело с действующим протоколом clientA и clientB общаются друг с другом в объектах Message.

Псевдо (код) Пример

в этом примере я предполагаю, что объект сообщения является не чем иным, как строкой, и единственной командой является «whattimeisit», на который ответом является местное время в виде строки

  • ClientA выполняет вызов к серверу. SendMessageToClient ("clientA", "clientB", "whattimeisit");
  • Сервер сохраняет это сообщение в базе данных с идентификатором 1
  • ClientB выполняет вызов к серверу GetMessages ("clientB");
  • Сервер получает сообщение с идентификатором 1
  • ClientB получает обратно «whattimeisit» в качестве ответа
  • ClientB выполняет вызов к серверу. SendMessageToClient ("clientB", "clientA", "19:50:12");
  • Сервер сохраняет это сообщение в базе данных с идентификатором 2
  • ClientA выполняет вызов к серверу GetMessages («clientA»);
  • Сервер получает сообщение с идентификатором 2
  • ClientA получает обратно «19:50:12» в ответ
1 голос
/ 23 августа 2009

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

  1. Скрыть сообщение в том, что пропускает брандмауэр
  2. Использовать канал связи, который брандмауэр не контролирует

В случае более раннего:

Вы можете передавать сообщения на прокси, который передал их (электронная почта - хороший, но не совсем отзывчивый пример).

В случае последнего:

Вы можете поместить сообщения в файл say, где их переносит какой-то другой транспортный уровень

...