当我关闭/终止WCF通道/代理时会发生什么?

27

我试图更好地理解使用WCF代理时发生的情况。我不太明白在关闭(或不关闭)代理时会发生什么。

  • 当我在WCF代理上调用Close()或Abort()时,会发生什么?它们之间有什么区别?
  • 在不同类型的绑定之间有什么区别(例如,无会话的BasicHttpBinding与某些具有会话的绑定)?
  • 为什么在某些情况下Close()会抛出异常并且为什么它可能是一个阻塞操作?

很多关于这个主题的文章都写了,可以看一下这里:https://dev59.com/40zSa4cB1Zd3GeqPno0p - Boris Modylevsky
1个回答

30

关闭 WCF 客户端
客户端有一个继承的责任去优雅地关闭连接。强烈建议关闭代理客户端。如果客户端和服务之间的绑定是基于传输层的可会话的,则关闭代理以拆除双方之间的连接是必要的。服务定义了用于并发连接的有效负载阈值。如果并发连接数线性增加超过此阈值,则整体服务性能呈指数下降趋势。这就是为什么尽快处理连接是至关重要的原因。关闭代理还会通知服务实例它不再被使用,并且可能由 GC (根据服务实例管理)回收。如果客户端不关闭连接,则 WCF 超时(存在于配置文件中)仍会自动拆除连接。

中止 WCF 客户端
如果服务-客户端交互中出现故障,则两端对象可能完全损坏。因此,在异常后使用代理不被建议。由于 WCF 绑定使用传输会话,客户端在故障后甚至无法关闭它(如果没有传输层会话,则可以使用或关闭代理客户端,但这并不推荐,因为会话的配置可能会发生更改)。因此,在发生故障后,唯一安全的操作是中止代理。

关闭是同步操作,如果传输会话受到故障的损坏,则它可能会抛出异常,并且在接收到服务确认响应之前是阻塞操作(适用于某些绑定)。


2
如果并发连接数线性超过此“阈值”,则整体服务性能会呈指数级下降。请问你能帮忙理解这一点吗? - Abhijeet
1
这只是我在实践中观察到的一些事情 - 负载和资源通常会表现出这种方式。如果增加负载,吞吐量性能会提高。然而,在某个点上(饱和点),负载会变得像一个盒子通常可以处理的那样高。在这一点上,您将获得最大性能。如果您继续增加负载,服务不会立即死亡,但它将“缓冲”请求。这有助于解决拾取负载流量的问题,因为通常持续时间很短。但在我们的示例中,我们将继续增加负载并填充一些内部缓冲区。饱和后性能下降得更快。 - oleksii
1
我仍然不理解Abort的作用,更重要的是,如果不调用Abort会出现什么问题。如果您正在尝试重新使用代理客户端实例,那么这是否只有在这种情况下才有影响?不调用Abort会影响新实例吗?或者这是一个内存泄漏问题吗? - xr280xr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接