WCF客户端代理初始化

我正在使用WCF服务并使用VS 2008服务引用创建其代理。

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

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

我使用.Net framework 3.5 SP1,basicHttp绑定很少定制。

这取决于 ;-)

如果您的应用程序中有一个序列需要多个调用,您可以挂起代理客户端并继续使用它来进行进一步调用。 但要注意检查“故障”状态 – 如果服务器上发生错误,客户端代理和服务器之间的通道可能会“故障”,从而导致客户端代理无法使用。

另外 – 昂贵的部分是创建ChannelFactory – 当您在代码中创建客户端proyx时,您可以尝试将这两个步骤分开:

 ChannelFactory factory = new ChannelFactory(); 

继续关注该渠道工厂,例如将其缓存到某个地方

第二步应该在时间和马力方面不那么密集:

 IYourService client = factory.CreateChannel(); 

你可以在每次调用(或调用序列)之前执行此步骤,并且不应该从中获得糟糕的性能。

我强烈建议尽可能避免单身人士 – 这就像打开一堆蠕虫一样,除非你绝对必须这样做,否则不要这样做(例如,管理对一次只能为一个呼叫者提供的单一资源的访问权限)。

很抱歉打开一个旧问题,但我想添加它以便于参考。

我完全同意marc_s和rally25rs。 所以从那里开始,还要考虑使用处理故障状态的代理或包装器。 这是一个关于SO 的问题 ,讨论了一些解决方案, 这是我在Corneliu网上遇到的另一个很好的解决方案,“ 构建一个可重用的ClientBase代理 ”。 他的解决方案生成包装器,公开您的服务方法以获得最大的便利和性能。 我仍然要测试它是否有效:)。