WCF双向HTTP通信绕过防火墙

Jos*_*osh 2 wcf firewall duplex

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

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

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

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

谢谢

oll*_*lle 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的数据库中
  • 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"作为回应