重复调用的 WCF 通道生命周期

Posted

技术标签:

【中文标题】重复调用的 WCF 通道生命周期【英文标题】:WCF channel lifetime with repeat calls 【发布时间】:2011-01-01 22:20:42 【问题描述】:

也许这是一个显而易见的问题,也许不是。想象一个 GUI 控制应用程序,其中每个按钮按下都会调用远程 WCF 服务上的不同函数。大约每隔几秒钟就会频繁使用按钮。一般来说,最好在每次函数调用时打开和关闭 WCF 通道,还是在应用程序的生命周期内保持通道打开?当然,假设这个应用程序只有几个实例化。

注意。这个问题并不是关于示例,而是帮助我了解这里的最佳实践。

【问题讨论】:

【参考方案1】:

如果您可以避免在每次调用之前重新创建客户端代理,那肯定会提高您的性能。

但是:这样做,您必须确保服务器端的所有异常都得到正确处理(可能通过在您的服务上实现IErrorHandler 接口)并转化为 SOAP 错误,这可以在不导致通道故障的情况下传输回客户端。

如果单个异常逃脱了您,并作为“常规” .NET 异常发送回客户端,则通道(您的客户端和服务器之间的通信链接)将出现故障 - -> 即变得无用。

在这种情况下,您需要首先检查该状态(通道具有.State 属性),如果遇到故障通道,您只能在调用之前再次重新创建客户端代理方法。

【讨论】:

【参考方案2】:

不建议让通道保持打开状态,而是让 WCF 决定何时物理关闭\打开通道。您可以通过反复使用相同的客户端对象来节省一些资源,只需确保没有 2 个线程同时使用它(以防两个按钮可以同时按下或一个接一个地按下)。

【讨论】:

以上是关于重复调用的 WCF 通道生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Netty:netty 中通道的进程生命周期是啥?

Activity生命周期以及启动模式对生命周期的影响

Servlet的生命周期是怎么回事?

ASP.NET 应用程序生命周期 - 不是页面生命周期 [重复]

Activity与Fragment的生命周期详解

Flutter生命周期