WCF客户端代理初始化

问题描述 投票:8回答:2

我正在使用WCF服务,并使用VS 2008服务参考创建了它的代理。

我正在寻找调用WCF服务方法的最佳模式

  • 是否应该在每次调用服务方法时创建客户端代理实例,并在完成后立即关闭客户端?对客户端应用程序进行概要分析时,我可以看到初始化代理客户端时花费大量时间来获取Channel
  • 我应该为客户端代理使用Singleton模式,以便我可以只使用一次实例并摆脱重新初始化的开销吗?这种方法有任何隐藏的问题吗?

我使用的是.Net框架3.5 SP1,basicHttp绑定,几乎没有定制。

c# wcf channel
2个回答
11
投票

取决于;-)

如果您的应用程序中有一个序列需要一个接一个的调用,您可以挂断代理客户端并继续使用它来进行进一步的调用。请注意,如果要检查“故障”状态-如果服务器上发生错误,则客户端代理和服务器之间的通道可能会“故障”,因此您的客户端代理将无法使用。

而且-昂贵的部分是ChannelFactory<T>的创建-您可以在用代码创建客户代理时尝试将这两个步骤分开:

ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();

请继续使用该渠道工厂,例如缓存到某处

第二步在时间和马力上的强度应大大降低:

IYourService client = factory.CreateChannel();

您可以在每次调用(或调用序列)之前执行此步骤,并且实际上不应因此而导致性能下降。

我强烈建议尽可能避免单例-就像打开一罐蠕虫一样,除非绝对肯定要这样做(例如,管理一次只能访问一个呼叫者的单个资源的访问权限,否则不要这样做) )。

马克


1
投票

很抱歉提出了一个老问题,但我想添加此内容以便于参考。

我完全同意marc_s和rally25rs。因此,从此处开始,但还要考虑使用处理故障状态的代理或包装器。 SO上的Here is a question讨论了一些解决方案,Corneliu在Internet上遇到了here is another好的解决方案,“ 构建可重用的ClientBase代理”。他的解决方案生成的包装器公开了您的服务方法,以实现最大的便利性和性能。我仍然必须测试它是否有效:)。

© www.soinside.com 2019 - 2024. All rights reserved.