为每个方法调用创建 WCF 通道

7
在我的当前Web项目中,我们对每个远程服务的方法调用都执行ClientFactory.CreateChannel。这真的有必要吗?最佳实践是什么?
2个回答

2
这在一定程度上取决于您的需求。相对而言,打开通道是比较昂贵的。最佳实践是由执行远程调用的类实现IDisposable接口,应该调用ClientFactory.CreateChannel方法一次,使用通道进行所有方法调用,并在调用Dispose方法时关闭通道。尽管如此,如果调用远程服务的方法之间的时间很长(超过通道的默认空闲超时时间10分钟),那么做一个ClientFactory.CreateChannel并没有什么特别不好的地方,但我仍然认为最好使用IDisposable接口并使用'using'关键字来封装类的使用。

实际上,创建通道非常轻量级 - 创建ChannelFactory对性能的影响比较大... - marc_s
@marc_s:我认为这取决于情况,例如如果通道有安全性,每次打开套接字到服务时都会进行安全协商,这可能会导致您的方法调用时间显著延长,以我个人看来。 - Steve Ellinger
@marc_s,他们没有改进ChannelFactory的创建吗?或者至少我确定我读到过第一次之后他们改进了创建。更新:http://blogs.msdn.com/b/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx - MattC

0
为每个方法调用创建一个新通道是一个不好的实践,普遍来说。

对于双工WCF服务

创建单个通道并使用它直到不再需要与服务器进行通信或该通道被关闭。

创建通道后,在向服务器发出任何调用之前,建议检查通道的状态(错误、打开、关闭)。

建议注册通道关闭/错误事件以立即了解其发生。这样您可以采取必要的措施或/和再次使用相同的通道对象引用创建通道。

对于普通WCF服务

创建代理模式,创建通道/重用/重新创建、错误处理和处理。设置适当的不活动超时时间,并将WCF客户端的代理适当配置与最适合您解决方案的配置一起使用。

始终进行负载测试!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接