我正在使用 WCF 服务并使用 VS 2008 服务参考创建了它的代理。
我正在寻找调用 WCF 服务方法的最佳模式
- 我是否应该在每次调用服务方法时创建客户端代理实例并在完成后立即关闭客户端?当我分析我的客户端应用程序时,我可以看到在初始化代理客户端时获取通道需要很长时间
- 我是否应该为客户端代理使用单例模式,以便我可以只使用一次实例并摆脱重新初始化的开销?这种方法有什么隐藏的问题吗?
我正在使用 .Net framework 3.5 SP1,basicHttp
几乎没有自定义绑定。
这取决于 ;-)
如果您的应用程序中有一个序列需要一个接一个地调用,您可以挂在代理客户端上并继续使用它来进行进一步的调用。请注意检查“故障”状态 - 如果服务器上发生错误,客户端代理和服务器之间的通道可能“故障”,因此您的客户端代理将变得不可用。
此外 - 昂贵的部分是创建ChannelFactory<T>
- 当您在代码中创建客户端代理时,您可以尝试将这两个步骤分开:
ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();
挂在那个频道工厂,例如把它缓存在某个地方
第二步在时间和马力方面应该少得多:
IYourService client = factory.CreateChannel();
您可以在每次调用(或调用序列)之前执行此步骤,并且不应该因此而导致性能不佳,真的。
我强烈建议尽可能避免使用单例 - 这就像打开一罐蠕虫一样,除非您绝对必须这样做,否则不要这样做(例如,管理对一次仅对一个调用者可用的单个资源的访问)。
马克
很抱歉提出一个老问题,但我想添加这个以方便参考。
I fully agree with marc_s and rally25rs. So start there, but also consider using a proxy or wrapper that handles faulted states. Here is a question on SO that discusses some solutions, and here is another good solution I came across on the internet by Corneliu, "Building a reusable ClientBase proxy". His solution generates wrappers that expose your service methods for maximum convenience and performance. I still have to test if it works though :).