WCF 客户端代理初始化

Posted

技术标签:

【中文标题】WCF 客户端代理初始化【英文标题】:WCF client proxy initialization 【发布时间】:2010-12-13 11:58:42 【问题描述】:

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

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

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

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

【问题讨论】:

@123Developer:太好了——谢谢! (对于新手来说,这并不容易“显而易见”——我同意——这就是我指出的原因) 【参考方案1】:

这取决于;-)

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

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

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

坚持使用该频道工厂,例如将其缓存在某处

第二步在时间和马力方面应该少得多:

IYourService client = factory.CreateChannel();

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

我强烈建议尽可能避免使用单例 - 这就像打开一罐蠕虫一样,除非您绝对、绝对必须这样做(例如,管理对单个资源的访问,该资源仅供一个呼叫者在时间)。

马克

【讨论】:

我同意制作单个工厂实例的方法,并且没有单例通道实例。对于通道,使用 em 和松散 em,并确保正确关闭它们,检查故障状态。【参考方案2】:

很抱歉提出一个老问题,但我想添加这个以方便参考。

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

【讨论】:

以上是关于WCF 客户端代理初始化的主要内容,如果未能解决你的问题,请参考以下文章

从代理客户端将参数传递给 WCF 服务中心

终于解决:升级至.NET 4.6.1后VS2015生成WCF客户端代理类的问题

WCF通过SVCUtil.exe生成客户端代理类和配置文件(转)

WCF 客户端代理在被 hangfire 工作人员服务使用时陷入故障状态

代理模式

是否可以在请求标头中传递 WCF 客户端代理元数据信息?