WCF服务器推送连接测试。中国平安()?

时间:2009-11-05 17:06:47

标签: wcf callback server-push connectivity

使用暗示的技术:

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.callbackcontract.aspx

我正在为我的API实现ServerPush设置,以便从事件服务器获取实时通知(无轮询)。基本上,Server有一个RegisterMe()和UnregisterMe()方法,客户端有一个名为Announcement(字符串消息)的回调方法,通过WCF中的CallbackContract机制,服务器可以调用。这似乎运作良好。

不幸的是,在此设置中,如果服务器崩溃或者不可用,则客户端将不知道,因为它只是在侦听消息。线路上的沉默可能意味着没有公告,也可能意味着服务器不可用。

由于我的目标是减少轮询而不是即时性,我不介意在服务器上添加一个void Ping()方法,以及RegisterMe()和UnregisterMe(),它们仅用于测试服务器的连接。我相信,定期测试这种方法将确保我们仍然保持联系(并且传输中没有公告被删除,因为这是TCP)

但Ping()方法是否必要,或者此连接测试是默认情况下作为WCF的一部分提供的 - 如serverProxy.IsStillConnected()等。根据我的理解,通道的状态只会在失败的Ping()之后返回Faulted或Closed,但不能代替它。

2)从更广泛的角度来看,这种回调方法是否可靠?这不适用于http或ajax - 连接的客户端数量很少(数十个客户端,最大值)。这种方法有严重问题吗?由于这似乎是一个轻微的风险,如何通过不快速处理它的回调队列来限制慢/恶意客户端阻止服务器?是否有一种特定于我可以设置的回调的超时而不影响其他操作?

3 个答案:

答案 0 :(得分:2)

您的方法听起来很合理,以下是一些可能有帮助或可能没有帮助的链接(它们并不完全相关):

Detecting Client Death in WCF Duplex Contracts http://tomasz.janczuk.org/2009/08/performance-of-http-polling-duplex.html

在应用程序协议中内置一些运行状况检查是有道理的。

如果您担心恶意客户端,请添加授权。

我上面分享的第二个链接有一个示例pub / sub服务器,您可以使用此代码。需要注意的几件事 - 考虑通过异步调用或单独的线程推送通知。并在tcp绑定上设置sendTimeout。

HTH

答案 1 :(得分:1)

我写了一个WCF应用程序并遇到了类似的问题。我的服务器检查客户端没有通过定期向他们发送ping来“插拔”。实际的send方法(异步是服务器)的超时时间为30秒。客户端只是检查它每30秒收到一次数据,而服务器会在达到超时时捕获异常。

需要授权连接到服务器(通过使用WCF的内置功能,强制连接人员首先调用特定方法)所以从恶意客户端的角度来看,您可以轻松添加代码来检查和禁止他们的帐户如果他们做了可疑的事情,同时断开了未经过身份验证的用户。

由于我编写的服务器是异步的,因此无法真正阻止它。我想这可以解决你的最后一点,因为异步发送方法会触发ping(以及任何其他数据发送)并立即返回。在SendEnd方法中,它将捕获超时异常(有时是客户端的多个)并断开它们,而不会阻塞或冻结服务器。

希望有所帮助。

答案 2 :(得分:1)

您可以使用类似于Juval建议的发布者/订阅者服务: http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

如果丢失服务器是典型情况,这将允许您持久保留订阅者。此示例中的发布方法还在一个单独的线程上调用每个订阅者,因此一些死用户不会阻止其他用户......