WCF客户端代理初始化

10

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

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

  • 我应该每次调用服务方法时都创建客户端代理实例,并在完成后立即关闭客户端吗?当我对客户端应用程序进行分析时,我发现在初始化代理客户端时获取通道需要很长时间。
  • 我应该使用单例模式为客户端代理,以便可以使用唯一的实例并消除重新初始化的开销吗?这种方法是否存在任何隐藏问题?

我正在使用带有少量自定义的.NET Framework 3.5 SP1和basicHttp绑定。


@123Developer:太好了-谢谢!(对于新手来说,这并不是很“明显”-我同意-这就是为什么我要指出它的原因) - marc_s
2个回答

13

这取决于情况 ;-)

如果您的应用程序中有一个需要多次连续调用的序列,您可以保留代理客户端并继续使用它来进行进一步的调用。但要注意检查“故障”状态 - 如果服务器出现错误,则客户端代理与服务器之间的通道可能会“故障”,因此您的客户端代理将无法使用。

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

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

记住这个通道工厂,例如在某处缓存它。

第二步在时间和处理能力上应该要少得多:

IYourService client = factory.CreateChannel();

在每次调用(或调用序列)之前执行此步骤,不应该真正影响性能。

我强烈建议尽可能避免使用单例 - 这就像打开一罐虫子,除非你绝对有必要(例如管理仅一次只能为一个调用者提供的单个资源的访问),否则不要这样做。

Marc


1
我赞同制作单个工厂实例的方法,而不是使用单例通道实例。对于通道,请使用em和loose em,并确保正确关闭它们并检查其错误状态。 - CodingWithSpike

1

抱歉对一个老问题提出异议,但我想加上这个以便于参考。

我完全同意marc_s和rally25rs的观点。所以从那里开始,但也考虑使用处理故障状态的代理或包装器。这里有一个关于SO的问题讨论了一些解决方案,这里还有一个我在互联网上看到的好解决方案,来自Corneliu的"构建可重用的ClientBase代理"。他的解决方案生成了暴露你的服务方法以获取最大便利性和性能的包装器。不过我还需要测试它是否有效:)。


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