我正在使用wsHttpBinding
InstanceContextMode.PerCall
。在服务器端,我需要检测客户端是否已正确接收response
。如果不是,我需要清除服务器端的一些东西。为此,我尝试使用OperationContext.Current.InstanceContext.Closed
和OperationContext.Current.InstanceContext.Faulted
。 OperationContext.Current.InstanceContext.Closed
始终触发但是。无论我做什么,都不会触发故障事件(连接超时,在接收数据时关闭客户端,拔掉电缆)。 OperationContext.Current.InstanceContext.State
也始终关闭。
如何检测客户端未收到请求? 作为替代解决方案,我在想是否在客户端遇到错误,在服务器端调用清理方法,但这可能会使事情变得复杂,因为互联网连接可能会停机一段时间。
答案 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”。