WCF双向HTTP通信绕过防火墙

时间:2009-08-23 03:38:13

标签: wcf firewall duplex

我想使用WCF启用双向通信,而无需在客户端上打开端口。

我正在开发类似于P2P应用程序(类似于teamviewer / logmein)的东西,您不需要打开端口进行通信。

如何通过HTTP / HTTPS完成双向通信,而无需在客户端中打开端口?

注意:可以在服务器中打开端口80 ......没有问题。

由于

2 个答案:

答案 0 :(得分:5)

你提到的那些系统如下工作。他们首先尝试使客户端A和客户端B直接通过一系列不同的拓扑进行通信,这些拓扑基本上要求其中一个允许传入连接,如果失败,则它们会回退到作为中间人的第三方。因此,客户端A与服务器通信并向客户端B发送消息。然后,客户端A将响应时发回给它的消息。客户端B将消息发送到服务器,它从服务器返回来自客户端A的消息。这样,客户端A和B都始终启动连接,并且不需要为传入流量打开端口。

如果我在你的情况下理解正确,你总是希望男人在中间。为此,您必须编写一个提供所有相关方法的WCF服务。例如

之类的东西
  • void SendMessageToClient(Guid senderId,Guid recipientId,Message msg)
  • 消息[] GetMessages(Guid recipientId)

然后让这些方法分别从某个地方(如数据库或队列或其他东西)存储和检索那些Message对象。

然后使用HTTP绑定编写连接到WCF服务的客户端,并调用服务器上的方法并处理结果。

我希望你理解

  • a)这不是一种非常有效的沟通方式。
  • b)很难测试和调试并了解最新情况,因为涉及的人数众多且通信异步生活在3个不同的进程中。
  • c)它在通信的顶部添加了一个额外的层,因此当您处理基础设施位时以及当您处理基础设施时,您需要在头脑中保持清晰(并且优先使用代码)正在处理实际协议clientA和clientB在Message对象中相互通信。

伪(代码)示例

在这个例子中,我假设消息对象只不过是一个字符串,唯一的命令是“whattimeisit”,响应是字符串形式的本地时间

  • ClientA调用server.SendMessageToClient(“clientA”,“clientB”,“whattimeisit”);
  • 服务器将此消息存储在ID为<1 li>的数据库中
  • ClientB调用服务器GetMessages(“clientB”);
  • 服务器检索ID为1的邮件
  • ClientB收回“whattimeisit”作为回复
  • ClientB调用server.SendMessageToClient(“clientB”,“clientA”,“19:50:12”);
  • 服务器将此消息存储在ID为2的数据库中
  • ClientA调用服务器GetMessages(“clientA”);
  • 服务器检索ID为2的邮件
  • ClientA收回“19:50:12”作为回复

答案 1 :(得分:1)

我不确定我理解。数字防火墙的目的是(通常)控制通信信道。如果您想绕过防火墙进行通信,您有两种选择。

  1. 在防火墙允许的内容中隐藏消息
  2. 使用防火墙无法控制的通信渠道
  3. 在前面的情况下:

    您可以将邮件传递给传递它们的代理(电子邮件是一个很好但不完全响应的示例)。

    对于后者:

    您可以将消息放在说文件中,其他传输层承载它们