WCF客户端代理初始化

时间:2009-11-05 16:29:04

标签: c# wcf channel

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

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

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

我正在使用.Net framework 3.5 SP1,basicHttp绑定,几乎没有自定义。

2 个答案:

答案 0 :(得分:10)

取决于; - )

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

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

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

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

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

IYourService client = factory.CreateChannel();

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

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

马克

答案 1 :(得分:1)

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

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