WCF是否优化了客户端的连接?

时间:2008-11-09 03:31:36

标签: c# .net wcf design-patterns performance

我们目前正在开发一个将使用WCF服务的应用程序。主持人(客户端)正在使用优秀的WCF Service Proxy Helper from Erwyn van der Meer

我想知道的......如果我多次打开这个对象......它会导致多个(昂贵的)连接,还是WCF管理它并汇集连接。

我想知道这个的原因是因为我们将在同一个Web请求中的不同时间点调用服务的方法,并且我们当前已在调用中包装了Service代理类的实例。

例如:

MyService.MyMethod1() // wraps the connection usage as well as the call to the service

关于如何在保持代码符合SRP的同时最大限度地减少连接数量的任何建议都非常好。

所以?有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您应该尝试最小化您创建的代理对象的数量。 WCF中的代理设置非常昂贵,因此创建一个并多次调用函数肯定比为每个方法调用创建一个新函数更有效。

代理对象和连接之间的关系取决于使用的传输。对于http传输,将为每个函数调用启动HTTP连接。对于net.tcp传输,连接在Open()时建立并保持到Close()。某些绑定设置(例如那些支持WS-SecureConversation的设置)将产生额外的“内务”连接和消息交换。

AKAIK,没有开箱即用的绑定执行连接池。

答案 1 :(得分:3)

如果这是你的意思,它不会像SqlConnection一样进行池化。

[警告:我在这里松散地使用“连接”来表示逻辑连接,不一定是物理连接]

在按需连接和保持连接之间,两种方法都有优点和缺点。在初始化连接时会有一些开销,所以如果你正在做5件事,你应该尝试在同一个代理上执行它们 - 但我不会为了它而保留一个长期代理。

特别是,在生命周期管理方面,一旦代理出现故障,它就会出现故障 - 因此您需要能够从偶然的故障中恢复(这应该是预期的)。同样,在某些配置(会话/实例化的某些组合)中,连接在服务器上具有明确的占用空间 - 因此为了提高可伸缩性,您应该保持连接的短暂性。当然,对于 true 可伸缩性,您通常也希望禁用这些选项!

创建连接的成本还取决于安全模式等。 IIRC,使用消息安全性打开双向验证连接比建立TransportWithMessageCredential连接更昂贵 - 所以“YMMV”就是这种情况。

就我个人而言,我发现代理性能最大的常见问题与设置conncetion的时间无关 - 这是API的烦恼。即。

情景A:

  • 打开连接
  • 使用大型有效负载执行1次操作(即表示“执行这19项操作”的消息)
  • 关闭代理

情景B:

  • 打开连接
  • 使用小型有效负载执行19次操作
  • 关闭连接

然后,由于延迟等原因,方案A通常会显着更快。而IMO甚至不考虑通过WCF进行分布式事务;-p