假设您从一个项目公开WCF服务,并使用“添加服务引用”(在本例中为Framework 3.5 WPF应用程序)在另一个项目中使用它。
当您重新实例化ClientBase派生代理时,ClientBase是否会执行底层通道的任何类型的连接池,或者每次都会产生与服务建立连接的全部开销?我特别关注这一点,因为我们使用了wsHttpBinding的安全模式=“Message”。
答案 0 :(得分:7)
请查看this article,其中介绍了有关如何缓存客户端代理的最佳做法。如果您直接创建代理(MyProxy p = new MyProxy(...)
),那么您似乎无法缓存底层的ChannelFactory,这是一个昂贵的部分。但是,如果使用ChannelFactory
创建代理,ChannelFactory
将由AppDomain级别的代理缓存,并且它基于您传递给代理的参数(类似于基于的连接池)在连接字符串上。)
本文详细介绍了有关幕后内容的详细信息,但主要的一点是,如果使用ChannelFactory
创建代理而不是直接实例化,会导致性能提升。
希望这会有所帮助!!
答案 1 :(得分:1)
This article解释是的,WCF有TCP连接池。它没有解释的是在哪些情况下它会生效。据我所知,只要你通过提供一个命名端点(IE不使用自定义Binding
对象)构建你的代理对象,连接池就可以了。我通过在我的Web应用程序中加载负载并使用netstat
检查打开的TCP连接来测试这一点。
但最重要的是,您不需要缓存代理对象以重新使用TCP连接。