我正在使用同步WCF服务,该服务在99%的情况下运行良好,但在极少数情况下,客户端会在服务器完成处理之前超时。有没有办法在SERVER端检测到客户端已经超时?我可以使用异步操作,但在这种情况下,服务器端超时检测将为我节省大量的工作。我正在使用net.tcp绑定,如果这很重要。
答案 0 :(得分:1)
对于net.tcp,http等一般没有。 (请参阅上面的评论以获取一些想法;对于其他协议/绑定/等也可能有所不同。)
原因是,服务器端的WCF基础结构代码在完成执行服务操作的实现代码并编组响应之前不会使用该通道。只有这样它才会尝试发送响应,并在此时识别连接已被客户端中止。
当服务器收到该错误时,用户代码(您的服务操作实现)已经完成,因此您无法再从那里做出反应。它可能来自调度员或其他扩展点,但我个人没有尝试过。但是,这也不会使您的服务器免于不必要的工作,因为如上所述,当服务器实际尝试发送答案时,仍然只能识别客户端断开连接。
缓解此类问题的一种“简单”方法可能是将正在完成的工作拆分为多个服务操作/调用(如果可能的话;并且不会在此过程中意外引入服务器端状态)。或者正如其他人所说,让客户端实现一个“Ping”接口,服务器可以使用该接口来检查客户端是否仍然“活着”并且仍然需要响应。