当我关闭/中止WCF频道/代理时会发生什么?
问题描述:
我试图更好地理解当我使用WCF代理时发生了什么。我无法理解关闭(或不关闭)代理时发生的情况。当我关闭/中止WCF频道/代理时会发生什么?
- 当我在WCF代理上调用Close()或Abort()时发生了什么?有什么不同?
- 它在不同的绑定类型之间有什么区别(比如,一个无会话的BasicHttpBinding和某些会话)?
- 为什么Close()会在某些情况下抛出,为什么它可能是阻塞操作?
答
关闭WCF客户端
一个客户的正常关闭连接继承的责任。总是建议关闭代理客户端。如果客户端和服务之间的绑定是传输层会话,那么关闭代理对于拆除双方之间的连接至关重要。服务具有为并发连接定义的有效负载阈值。如果并发连接的数量线性地高于此阈值,则整体服务性能以指数规律地减少。这就是为什么尽快处理连接至关重要。关闭代理服务器还会通知服务实例它不再被使用,并可能被GC收集(服务实例管理服务)。如果客户端没有关闭连接,它仍然会被WCF超时(在配置文件中找到)自动关闭。
中止WCF客户端
在存在在服务客户端交互的故障的情况下,两端的对象都是潜在的完全破碎。因此在不建议异常之后使用代理。鉴于WCF绑定使用传输会话,故障后的客户端甚至无法关闭它(如果没有传输层会话,则客户端可以使用或关闭代理,但不建议这样做,因为会话配置可能会更改)。所以在发生故障之后,唯一安全的操作是中止代理。
Close是一个同步操作,它可以在传输会话已被故障损坏时抛出,并且在接收到来自服务的确认响应之前它是阻塞操作(某些绑定为true)。
很多被写了关于这个问题,开始看: http://stackoverflow.com/questions/2440608/wcf-service-client-lifetime – 2011-08-31 14:53:15