WCF服务 - 处理行为不端的客户?

时间:2011-12-11 21:15:36

标签: wcf tcp

我们的WCF解决方案有一个自定义侦听器,它继承自ChannelListenerBase<IDuplexSessionChannel>

我们有一个表现不好的客户(我们无法控制),它与我们进行了以下几行的TCP对话:

SYN  
SYN,ACK  
RST  

基本上,他们试图在套接字建立,失败和关闭套接字之前对套接字执行操作。

在我们的OnEndAcceptChannel代码中,我们最终无法创建一个通道,因为在我们到达那里时底层Socket已经关闭,并且我们得到一个SocketException。这似乎杀死了听众死了,阻止它接受进一步的联系。

OnEndAcceptChannel开始,我们尝试返回null,抛出异常,并使监听器处于故障状态,以便可以在调用堆栈的更高位置重新启动它。后者是我们发现的唯一解决方案,它将允许频道有效地继续收听,但这会产生令人不快(并且不可接受)的副作用,即杀死所有已建立的服务连接。

有人建议如何处理这种情况,继续倾听,不要失去已建立的联系......?

1 个答案:

答案 0 :(得分:1)

我们最终成功解决了这个问题。而不是返回null,我们返回了一个实现IDuplexSessionChannel的虚拟类的实例,它实际上是一个愚蠢的状态机,而且不管怎么说 - 愚弄WCF继续执行。