WCF 每次调用未触发故障事件
本文关键字:故障 事件 调用 WCF | 更新日期: 2023-09-27 18:36:35
我正在使用wsHttpBinding
和InstanceContextMode.PerCall
。在服务器端,我需要检测客户端是否正确接收了response
。如果没有,我需要清除服务器端的一些东西。为此,我尝试使用OperationContext.Current.InstanceContext.Closed
和OperationContext.Current.InstanceContext.Faulted
. OperationContext.Current.InstanceContext.Closed
总是着火,但是.无论我做什么,故障事件都不会触发(连接超时,在接收数据的同时关闭客户端,拔下电缆)。此外,OperationContext.Current.InstanceContext.State
总是关闭的。
如何检测客户端未收到请求?作为替代解决方案,我在考虑如果我在客户端发现错误,请在服务器端调用清理方法,但这可能会使事情复杂化,因为互联网连接可能会中断一段时间。
那一刻,你才会因为客户端故障和超时在服务端触发通道事件,这是非常愚蠢的。
要解决您的问题,您有三种解决方案:
1-如果客户端是你的,使用Duplex在客户端上调用虚拟方法,然后通道将触发其事件。
2-使用可靠会话(会话完全绑定+打开可靠会话),以便您可以设置"不活动超时",当KeepAlive消息等基础设施消息不再出现时,该超时将触发。我猜Inactivity超时默认为10分钟,而Windows KeepAlive频率为1秒,因此您可以将InactivityTimeout设置为5秒。
3-将IIS托管与其中一个http绑定一起使用,因此在您的操作中创建一个循环,该循环不断检查"System.Web"命名空间中"HttpContext.Current.Response"中的"ClientDisconnectedToken.IsCancelRequest"。