2009-11-05 126 views
5

我正在使用VS 2008服务引用来使用WCF服务并创建其代理。WCF客户端代理初始化

我找调用WCF服务方法

  • 我应该我每次调用服务方法,一旦我做完这些后关闭客户端时创建客户端代理实例的最佳模式?当我分析我的客户端应用程序时,我可以看到在初始化代理客户端时获取频道需要很长时间
  • 我应该为客户端代理使用Singleton模式,以便我可以只使用一次实例并获取摆脱重新初始化开销?这种方法有没有隐藏的问题?

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

+0

@ 123开发者:太好了 - 谢谢! (这对新人来说并不容易“明显” - 我同意 - 这就是我指出的原因) – 2009-11-05 17:06:43

回答

10

这取决于;-)

如果你在你的应用程序的顺序,需要一前一后几个电话,你可以挂在代理客户,并继续使用它进行进一步的调用。尽管要检查“故障”状态,但要警告 - 如果服务器上发生错误,客户端代理和服务器之间的通道可能“出错”,从而导致客户端代理变得不可用。

而且 - 昂贵的部分是ChannelFactory<T>的创建 - 你可以尝试这两个步骤分离出来,当你在代码中创建您的客户端proyx:到该通道工厂,例如

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

航缓存某处

第二步应该是在时间上和马力更密集:

IYourService client = factory.CreateChannel(); 

你可以做的每调用之前这一步(或称序列),不应该出来变得糟糕表现那真的。

我强烈建议尽可能避免单身 - 这就像打开一罐蠕虫,除非你绝对肯定必须(例如,管理对一个呼叫者只有一个呼叫者一次)。

马克

+1

我同意制作单个工厂实例的方法,并且没有单例通道实例。对于通道,请使用em和松动em,并确保正确关闭它们,检查故障状态。 – CodingWithSpike 2009-11-05 17:05:03

0

对不起,我踢了一个老问题,但我想添加此,以供参考。

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