2016-02-28 69 views
0

我使用wsHttpBindingInstanceContextMode.PerCall。在服务器端,我需要检测客户端是否已正确接收response。如果没有,我需要清除服务器端的一些东西。为此,我尝试使用OperationContext.Current.InstanceContext.ClosedOperationContext.Current.InstanceContext.Faulted。无论我做什么,发生的事件都不会触发(超时连接,关闭客户端,同时仍然接收数据,拔掉电缆)。另外OperationContext.Current.InstanceContext.State总是关闭。WCF PerCall not firing故障事件

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

+0

我不认为这是可能的。确认始终从服务器到客户端。如果您需要从客户端到服务器的确认,则必须通过调用其他Web服务来完成。 –

回答

0

当客户端成功调用Close()时,会触发服务端的通道事件,因为客户端出现故障并且超时,服务器端不会触发通道事件,直到服务器回复为止,这非常愚蠢。

解决你的问题,你有三种解决方法:

1如果客户是你的,使用双面调用客户端上的虚拟方法,则该通道将触发其事件。

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

3-使用IIS托管一个http绑定,因此在您的操作中创建一个循环,用于在“System.Web”命名空间中的“HttpContext.CurrentlResponse”中保持检查“ClientDisconnectedToken.IsCancellationRequested”。