我试图更好地理解使用WCF代理时发生的情况。我不太明白在关闭(或不关闭)代理时会发生什么。
- 当我在WCF代理上调用Close()或Abort()时,会发生什么?它们之间有什么区别?
- 在不同类型的绑定之间有什么区别(例如,无会话的BasicHttpBinding与某些具有会话的绑定)?
- 为什么在某些情况下Close()会抛出异常并且为什么它可能是一个阻塞操作?
我试图更好地理解使用WCF代理时发生的情况。我不太明白在关闭(或不关闭)代理时会发生什么。
关闭 WCF 客户端
客户端有一个继承的责任去优雅地关闭连接。强烈建议关闭代理客户端。如果客户端和服务之间的绑定是基于传输层的可会话的,则关闭代理以拆除双方之间的连接是必要的。服务定义了用于并发连接的有效负载阈值。如果并发连接数线性增加超过此阈值,则整体服务性能呈指数下降趋势。这就是为什么尽快处理连接是至关重要的原因。关闭代理还会通知服务实例它不再被使用,并且可能由 GC (根据服务实例管理)回收。如果客户端不关闭连接,则 WCF 超时(存在于配置文件中)仍会自动拆除连接。
中止 WCF 客户端
如果服务-客户端交互中出现故障,则两端对象可能完全损坏。因此,在异常后使用代理不被建议。由于 WCF 绑定使用传输会话,客户端在故障后甚至无法关闭它(如果没有传输层会话,则可以使用或关闭代理客户端,但这并不推荐,因为会话的配置可能会发生更改)。因此,在发生故障后,唯一安全的操作是中止代理。
关闭是同步操作,如果传输会话受到故障的损坏,则它可能会抛出异常,并且在接收到服务确认响应之前是阻塞操作(适用于某些绑定)。
Abort
的作用,更重要的是,如果不调用Abort
会出现什么问题。如果您正在尝试重新使用代理客户端实例,那么这是否只有在这种情况下才有影响?不调用Abort
会影响新实例吗?或者这是一个内存泄漏问题吗? - xr280xr