【问题标题】:WCF two way HTTP communication to bypass firewallsWCF 两种方式的 HTTP 通信绕过防火墙
【发布时间】:2009-08-23 03:38:12
【问题描述】:

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

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

如何在客户端不开端口的情况下通过HTTP/HTTPS实现双向通信?

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

谢谢

【问题讨论】:

    标签: wcf firewall duplex


    【解决方案1】:

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

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

    • void SendMessageToClient(Guid senderId, Guid recipientId, Message msg)
    • Message[] 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”作为响应

    【讨论】:

    • 嗨,在您的伪代码中...请参阅此部分“ClientB 调用服务器 GetMessages("clientB");"....如果我为此使用计时器,它将消耗我的服务器上有很多带宽吗?拓扑和一切都绝对正确。这就是我需要的。但是,我需要在现实世界场景中完成此操作
    • 所以,我认为这样做的方法是让客户端连接到服务器并保持会话打开。并让服务器通过同一个会话调用客户端上的方法……还有其他方法吗? (我不能使用计时器,因为多个客户端这样做会消耗我服务器的所有互联网带宽)
    • 就带宽而言。使用的带宽主要取决于消息对象的大小。更大的压力将是并发连接的数量,这取决于同时客户端的数量。 WCF 可以很好地扩展,您应该能够处理请求/秒的分配,如果需要,您可以添加额外的服务器,它们不再那么昂贵。我不知道您要进行哪种类型的通信,以及请求/每个客户/每个时间范围的数量有多高/多低。
    • 是的,您也可以使用您所描述的 DuplexBinding。
    【解决方案2】:

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

    1. 将消息隐藏在防火墙允许通过的地方
    2. 使用不受防火墙控制的通信通道

    在前面的情况下:

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

    如果是后者:

    您可以将消息放在其他传输层携带它们的文件中

    【讨论】:

    • 换句话说,我正在尝试通过任何一个端口进行隧道传输。我无法让用户在客户端进行端口转发和打开端口以接收传入连接。
    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2011-08-09
    • 2010-09-26
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多