2011-05-05 31 views
20

我试图更好地理解当我使用WCF代理时发生了什么。我无法理解关闭(或不关闭)代理时发生的情况。当我关闭/中止WCF频道/代理时会发生什么?

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

很多被写了关于这个问题,开始看: http://stackoverflow.com/questions/2440608/wcf-service-client-lifetime – 2011-08-31 14:53:15

回答

19

关闭WCF客户端
一个客户的正常关闭连接继承的责任。总是建议关闭代理客户端。如果客户端和服务之间的绑定是传输层会话,那么关闭代理对于拆除双方之间的连接至关重要。服务具有为并发连接定义的有效负载阈值。如果并发连接的数量线性地高于此阈值,则整体服务性能以指数规律地减少。这就是为什么尽快处理连接至关重要。关闭代理服务器还会通知服务实例它不再被使用,并可能被GC收集(服务实例管理服务)。如果客户端没有关闭连接,它仍然会被WCF超时(在配置文件中找到)自动关闭。

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

Close是一个同步操作,它可以在传输会话已被故障损坏时抛出,并且在接收到来自服务的确认响应之前它是阻塞操作(某些绑定为true)。

+2

如果并发连接数超过这个门槛'线性则整体服务表现呈指数级下降。“您能否帮助理解这一点。 – Abhijeet 2013-03-08 12:27:38

+1

这只是我在实践中观察到的 - 负载和资源通常以这种方式表现。如果增加负载,则吞吐量性能会增加。然而,在某个点(饱和点),负载会像盒子通常可以处理的那样高。此时你可以获得最高性能。如果持续增加负载,服务不会立即死亡,但会“缓冲”请求。这有助于解决挑剔负载流量,因为它通常持续很少的时间。但在我们的例子中,我们将继续增加负载并填充一些内部缓冲区。饱和后perf性能下降得快得多。 – oleksii 2015-11-09 17:16:22

相关问题