关闭/中止WCF通道/代理时会发生什么情况?

关闭/中止WCF通道/代理时会发生什么情况?,wcf,proxy,Wcf,Proxy,我试图更好地理解使用WCF代理时发生的事情。我很难理解当我关闭(或不关闭)代理时会发生什么 在WCF代理上调用Close()或Abort()时发生了什么?有什么区别 不同类型的绑定(比如无会话的BasicHttpBinding和有会话的东西)之间有什么区别 为什么Close()可以在某些情况下抛出,为什么它可以是阻塞操作 关闭WCF客户端 客户机有一项继承的责任,即优雅地关闭连接。始终建议关闭代理客户端。如果客户机和服务之间的绑定是传输层会话的,那么关闭代理对于中断双方之间的连接至关重要。服务

我试图更好地理解使用WCF代理时发生的事情。我很难理解当我关闭(或不关闭)代理时会发生什么

  • 在WCF代理上调用Close()或Abort()时发生了什么?有什么区别
  • 不同类型的绑定(比如无会话的BasicHttpBinding和有会话的东西)之间有什么区别
  • 为什么Close()可以在某些情况下抛出,为什么它可以是阻塞操作

    • 关闭WCF客户端

      客户机有一项继承的责任,即优雅地关闭连接。始终建议关闭代理客户端。如果客户机和服务之间的绑定是传输层会话的,那么关闭代理对于中断双方之间的连接至关重要。服务具有为并发连接定义的有效负载阈值。如果并发连接的数量线性地超过此阈值,则总体服务性能将呈指数下降。这就是为什么尽快处理连接至关重要的原因。关闭代理还会通知服务实例它不再使用,并且可能由GC收集(取决于服务实例管理)。如果客户端没有关闭连接,它仍然会被WCF超时(在配置文件中找到)自动中断

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


      Close是一个同步操作,如果传输会话被故障损坏,它会抛出,并且它是一个阻塞操作,直到收到来自服务的确认响应为止(对于某些绑定来说是如此)。

      关于这个主题的文章很多,开始看一看:如果并发连接的数量线性地超过这个
      阈值,那么总体服务性能就会呈指数级下降。
      请您帮助理解这一点。这只是我在实践中观察到的情况—负载和资源通常是这样的。如果增加负载,吞吐量性能就会增加。但是,在某个点(饱和点),负载会达到一个盒子通常可以处理的高度。此时,您将获得最高性能。如果您继续增加负载,服务不会立即消失,但它会“缓冲”请求。这有助于解决拣货流量,因为它通常只持续很短的时间。但在我们的示例中,我们将继续增加负载并填充一些内部缓冲区。饱和后性能下降得更快。我仍然不明白
      中止
      的作用,更重要的是,如果不调用
      中止
      ,会出现什么问题。仅当您试图重新使用代理客户端实例时,调用
      Abort
      是否会影响新实例,以及/或者是否存在内存泄漏问题?