【发布时间】:2011-03-07 13:49:48
【问题描述】:
这篇文章与我的previous post有些关联。
简而言之,我正在尝试构建一个反向轮询 http 绑定,主机轮询其客户端的请求。我使用来自http://archive.msdn.microsoft.com/duplexhttp 的代码作为我的参考。现在,在这个绑定中,主机实际上是一个客户端,而客户端实际上是服务器。这意味着,使用此反向轮询 http 绑定的客户端必须以隐藏的服务主机结束,提供通道泵设施。
现在,使用 ServiceHost 类型的通常模式要求存在实际的 WCF 服务实现。在我的例子中,ServiceHost 在客户端是打开的——它没有服务实现,这是正确的。
我想知道解决这个问题的最佳方法是什么?
理想情况下,该服务主机不需要任何服务。轮询主机发送消息实例,这些实例未映射到任何服务合同。这些消息由专用通道请求和回复 - 分别是 HttpPollingRequestChannel 和 HttpPollingReplyChannel。但我需要它实现的通道泵设施的服务主机。
编辑 1
我想需要更多背景信息来澄清图片。我们的系统由客户端、服务器和代理组成。客户端与服务器交谈,后者将他们的请求传达给代理,代理将结果传回服务器。所有频道都是直接的 HTTP - 简单明了。
但是,需要能够在防火墙后面部署代理,而不能在其上打开入站端口。这意味着,服务器 --> 代理通信不再可能。在我看来,我有两个选择:
- 重新设计服务器 --> 代理协议以使其使用轮询。
- 实现低级别绑定,这将在内部使用轮询。
你会做出怎样的选择?虽然,第二种选择更难实现,但这是一次性的努力。但它有很多好处。可能吗?我认为是的,因为 Silverlight 和 .NET 都已经存在轮询双工 http 绑定 - 请参阅本文开头的链接。
编辑 2
我想再次强调,我不想要双工。在双工通信中,回调是在请求的上下文中执行的,这意味着代理发送请求,服务器执行回调。我的情况不同。代理什么都不发送。服务器突然决定与代理进行通信。没有代表代理的有效请求。因此,现有的双工绑定对我来说并不好,但我正在尝试从中学习如何实现轮询。
大体是这样的:
- 代理不断轮询服务器
- 如果服务器想要向代理发送消息,则该消息将等待下一个轮询请求,并在轮询请求回复的顶部传递给代理。
轮询请求不是任何接口的一部分,它们是在低级绑定基础架构中实现的。
【问题讨论】:
-
如果代理在防火墙后面,它必须是发起连接的那个=它必须是服务器上托管的服务的客户端。
-
我想尽可能地隐藏投票。当它在绑定内部时。如果没有防火墙问题,它可以让我快速重新配置代理以使用常规绑定。
-
还是不明白。谁在您的案例中发起沟通,您的要求/限制是什么。
-
代理向已知服务器发布自己。之后,它处于空闲状态,等待源自客户端的请求通过服务器,服务器将它们“分派”给相关代理。我特意将调度用引号括起来,因为当代理位于防火墙后面时,代理本身会轮询已知服务器以完成工作。但从逻辑上讲,联系代理的是服务器。这就是防火墙不是问题时实际发生的情况。
标签: .net wcf wcf-binding