WCF PerCall未触发Faulted事件

时间:2016-02-28 23:18:15

标签: c# wcf

我正在使用wsHttpBinding InstanceContextMode.PerCall。在服务器端,我需要检测客户端是否已正确接收response。如果不是,我需要清除服务器端的一些东西。为此,我尝试使用OperationContext.Current.InstanceContext.ClosedOperationContext.Current.InstanceContext.FaultedOperationContext.Current.InstanceContext.Closed始终触发但是。无论我做什么,都不会触发故障事件(连接超时,在接收数据时关闭客户端,拔掉电缆)。 OperationContext.Current.InstanceContext.State也始终关闭。

如何检测客户端未收到请求? 作为替代解决方案,我在想是否在客户端遇到错误,在服务器端调用清理方法,但这可能会使事情变得复杂,因为互联网连接可能会停机一段时间。

1 个答案:

答案 0 :(得分:0)

当客户端成功调用Close()时,将触发服务端的通道事件,由于客户端故障和超时,您将不会在服务器端触发通道事件,直到服务器回复为止,这是非常愚蠢的。

要解决您的问题,您有三种解决方案:

1-如果客户端是您的,请使用双工在客户端上调用虚方法,然后通道将触发其事件。

2-使用可靠的会话(sessionfull绑定+可靠的会话打开),这样你就可以设置“InactivityTimeout”,当KeepAlive消息等infra消息不再出现时,它将触发。我猜InactivityTimeout默认为10分钟,而Windows KeepAlive频率为1秒,因此您可以将InactivityTimeout设置为5秒。

3-使用IIS主机与其中一个http绑定,因此在您的操作中创建一个循环,继续检查“System.Web”命名空间中“HttpContext.Current.Response”中的“ClientDisconnectedToken.IsCancellationRequested”。