我正在试图弄清楚PollingDuplex是否是解决我问题的正确方法。
这是我的情景: 1.第三方应用程序将带有客户端IP地址的UDP数据包发送到服务器应用程序。 2.服务器应用程序需要通知指定的客户端并发送一些数据。
客户端是Silverlight应用程序。
我一直在寻找一些指南和示例代码(http://petermcg.wordpress.com/2008/09/03/silverlight-polling-duplex-part-1-architecture/)但我不明白如何使用PollingDuplex在服务器上标识客户端。我知道客户端向服务器注册并不断轮询消息。我如何确保只有正确的客户端才能获得为该客户端指定的消息?换句话说,服务器上的消息不应该广播给所有轮询客户端,而只能发送给一个特定的客户端。
非常感谢任何帮助。
答案 0 :(得分:1)
无论您使用的是Net.TCP还是HttpDuplexBinding,都可以使用OperationContext.Current.Channel.SessionId
来识别客户端。更具体地说,您可以使用OperationContext.Current.GetCallbackChannel<IMyCustomServiceInterface>()
获取WCF用于与他们交谈的实际频道。您可以将这些存储在内存中,可能与从客户端传递的其他标识符相关联,当您需要与相关客户端通信时(例如,从UDP数据包传递数据),您可以调用适当的方法那个特定的存储频道;并且客户将收到通知。
我应该注意,虽然我不特别推荐HttpDuplexBinding,但除了它的怪癖和稳定性以及性能问题之外,它应该为你正在做的事情工作,并且完全一样的net.tcp。虽然客户在技术上会“轮询”服务器,但这对您来说是隐藏的。您在服务器上所知道的就是您在特定频道上调用方法。底层绑定代码负责确保通知正确的客户端。
答案 1 :(得分:0)
轮询双工实际上是一个完全客户端实现,仅存在于Silverlight中(除了Codeplex上的一个项目,微软自己的内部咨询服务为他们的高端客户开发),它没有常规的.NET框架版本。在服务器端没什么特别的。
这并不是真正意味着微软自己承认用于生产(我们公司的微软联系人坦诚地向我们承认这一点)。它不是非常强大或实现得很好,并且可以/将在任何类型的卷下DoS您的服务器: http://forums.silverlight.net/p/89970/239380.aspx
最好使用TCP和Silverlight 4中的会话来滚动自己的客户端轮询机制 - 或者(更好,更可扩展),这提供了真正的双工支持(因为连接不是无状态的,因此支持真正的推送通知) : http://www.silverlightshow.net/items/WCF-NET.TCP-Protocol-in-Silverlight-4.aspx