【问题标题】:Does WCF4 (.NET Framework 4) supports client connection pooling?WCF4 (.NET Framework 4) 是否支持客户端连接池?
【发布时间】:2011-12-19 09:04:34
【问题描述】:

所以问题是 WCF4 是否调用 WCF 服务的客户端连接池?例如,我们将 ASP .NET 应用程序作为客户端和服务(在不同的机器上)。然后在代码的某个地方我们有这样的东西:

ServiceClient client = new ServiceClient();
// Here some work with service goes...

假设我们在另一段代码中有另一个服务调用:

ServceClient client2 = new ServiceClient();
// Another one processing...

那么client2的连接会从连接池中获取吗?

【问题讨论】:

  • 你心目中的泳池是什么样的。您必须自己创建客户端池并实现逻辑。所以这个问题有点混乱。见blogs.msdn.com/b/wenlong/archive/2007/11/14/…
  • @sprinter252 我的意思是“原生池”由“WCf 驱动程序”实现。类似的事情是 ADO 连接池。
  • 那么答案应该是它取决于我猜你的服务上定义的 [ObjectPooling(MinPoolSize = 0, MaxPoolSize = 5)] 属性。

标签: c# .net wcf web-services connection-pooling


【解决方案1】:

“池化”取决于使用的传输协议。对于 HTTP,WCF 默认使用 HTTP persistent connections,它的生存时间很短(它们是 closed after 100s of inactivity),并且可以被后续请求(甚至来自不同的代理实例)重用。对于 TCP 和命名管道,WCF 提供了built-in pooling

【讨论】:

    【解决方案2】:

    你为什么要这样做? WCF 可以通过一个带有ConcurrencyMode.Multiple 的客户端接受多个请求。所以初始化两个客户端没有多大意义..

    WCF ServiceContract 具有此行为的三个重要属性,

    InstanceContextMode

    • PerSession(为每个会话创建一个服务实例)
    • 单一(为每个客户端创建单一实例)
    • PerCall(每次调用创建一个服务实例)

    并发模式

    • 多个(客户端可以同时进行多个调用 -> 多线程)
    • 单次(客户可以拨打一个电话,其他电话必须等到另一个电话完成)
    • 可重入(客户端可以同时进行多个调用,我不太清楚,但我认为如果一个调用使用另一个 wcf 服务,则可以处理另一个调用,直到另一个 wcf 服务调用完成,所以它会在 wcf 服务调用和响应之间释放锁定)

    会话模式

    • 允许(客户端可以使用会话,但不是必须)
    • NotAllowed(客户端无法使用会话)
    • 必需(客户端必须使用 Session)

    大多数时候我使用InstanceContextMode.PerSession(因为客户端1无法访问客户端2服务中的变量)、ConcurrencyMode.MultipleSessionMode.Required

    您还可以指定可以初始化多少个Instance,可以进行多少个Concurrent Calls,可以使用多少个Session。

    【讨论】:

    • 你应该花更多的时间来格式化你的答案。很少有人阅读格式错误的答案(因此您会获得更少的支持)
    • 您的回答与问题有何关联?会话、实例上下文模式和并发模式与重用传输连接无关——这就是连接池存在的原因。即使您提到的所有内容,仍然可以在后台使用连接池来提高性能。
    • 我的回答与他的示例有关,因为他正在开设两个客户。所以我认为这对他很有用
    • @RaphaelH 我的示例是关于控制器中的两个不同操作,因此它不会在客户端上使用,因为它们在不同的范围内。
    • @RaphaelH 顺便说一句,InstanceContextMode 的性能更好:PerSession 还是 Single?我认为很明显是Single模式比那两个慢。