WCF4(.NET Framework 4)是否支持客户端连接池?

时间:2011-11-01 10:05:44

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

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

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

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

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

那么从连接池获取client2连接吗?

2 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:2)

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

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

<强> InstanceContextMode

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

<强> ConcurrencyMode

  • 多个(客户端可以同时进行多个调用 - &gt;多线程)
  • 单人(客户可以拨打一个电话,其他人必须等到另一个电话完成)
  • 可重入(客户端可以同时拨打多个电话,我不完全确切,但我认为如果一个呼叫使用另一个wcf服务,可以处理另一个呼叫,直到另一个wcf服务呼叫完成,所以它在wcf服务调用的时间和响应之间释放锁定)

<强> SessionMode

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

我大部分时间使用InstanceContextMode.PerSession(因为客户端1无法访问客户端2服务中的变量),ConcurrencyMode.MultipleSessionMode.Required

您还可以指定可以初始化的实例数,可以进行的并发调用数以及可以使用的会话数。