【问题标题】:WCF PerCall not firing Faulted eventWCF PerCall 未触发故障事件
【发布时间】:2016-02-28 23:18:15
【问题描述】:

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

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

【问题讨论】:

  • 我认为这是不可能的。确认总是从服务器到客户端。如果您需要从客户端到服务器的确认,则必须通过调用另一个 Web 服务来完成。

标签: c# wcf


【解决方案1】:

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

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

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

2- 使用可靠会话(会话完全绑定 + 可靠会话已打开),因此您可以设置“InactivityTimeout”,当诸如 KeepAlive 消息之类的基础消息不再出现时,它将触发。我猜 InactivityTimeout 默认为 10 分钟,而 Windows KeepAlive 频率为 1 秒,因此您可以将 InactivityTimeout 设置为例如 5 秒。

3- 使用带有 http 绑定之一的 IIS 托管,因此在您的操作中创建一个循环,不断检查“System.Web”命名空间中“HttpContext.Current.Response”中的“ClientDisconnectedToken.IsCancellationRequested”。

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多