WCF 每次调用未触发故障事件

本文关键字:故障 事件 调用 WCF | 更新日期: 2023-09-27 18:36:35

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

如何检测客户端未收到请求?作为替代解决方案,我在考虑如果我在客户端发现错误,请在服务器端调用清理方法,但这可能会使事情复杂化,因为互联网连接可能会中断一段时间。

WCF 每次调用未触发故障事件

当客户端调用 Close() 成功时,服务端的通道事件会触发,直到服务端回复的

那一刻,你才会因为客户端故障和超时在服务端触发通道事件,这是非常愚蠢的。

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

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

2-使用可靠会话(会话完全绑定+打开可靠会话),以便您可以设置"不活动超时",当KeepAlive消息等基础设施消息不再出现时,该超时将触发。我猜Inactivity超时默认为10分钟,而Windows KeepAlive频率为1秒,因此您可以将InactivityTimeout设置为5秒。

3-将IIS托管与其中一个http绑定一起使用,因此在您的操作中创建一个循环,该循环不断检查"System.Web"命名空间中"HttpContext.Current.Response"中的"ClientDisconnectedToken.IsCancelRequest"。