我们的WCF解决方案有一个自定义侦听器,它继承自ChannelListenerBase<IDuplexSessionChannel>
。
我们有一个表现不好的客户(我们无法控制),它与我们进行了以下几行的TCP对话:
SYN
SYN,ACK
RST
基本上,他们试图在套接字建立,失败和关闭套接字之前对套接字执行操作。
在我们的OnEndAcceptChannel
代码中,我们最终无法创建一个通道,因为在我们到达那里时底层Socket已经关闭,并且我们得到一个SocketException。这似乎杀死了听众死了,阻止它接受进一步的联系。
从OnEndAcceptChannel
开始,我们尝试返回null,抛出异常,并使监听器处于故障状态,以便可以在调用堆栈的更高位置重新启动它。后者是我们发现的唯一解决方案,它将允许频道有效地继续收听,但这会产生令人不快(并且不可接受)的副作用,即杀死所有已建立的服务连接。
有人建议如何处理这种情况,继续倾听,不要失去已建立的联系......?
答案 0 :(得分:1)
我们最终成功解决了这个问题。而不是返回null,我们返回了一个实现IDuplexSessionChannel
的虚拟类的实例,它实际上是一个愚蠢的状态机,而且不管怎么说 - 愚弄WCF继续执行。