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

8
那么问题是,WCF4是否会调用客户端连接池来访问WCF服务?例如,我们有一个ASP .NET应用程序作为客户端,服务(在不同的机器上)。然后在某个代码段中,我们会有类似这样的内容:
ServiceClient client = new ServiceClient();
// Here some work with service goes...

假设我们在另一段代码中调用了另一个服务:
ServceClient client2 = new ServiceClient();
// Another one processing...

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

你心中有什么样的池子?你必须自己创建客户端池并实现逻辑。所以这个问题有点令人困惑。请参考http://blogs.msdn.com/b/wenlong/archive/2007/11/14/a-sample-for-wcf-client-proxy-pooling.aspx。 - Alexander Schmidt
@sprinter252 我的意思是“WCf驱动程序”实现的“本地池化”。类似的东西是ADO连接池。 - kseen
1
那么答案应该是取决于你的服务上定义的[ObjectPooling(MinPoolSize = 0, MaxPoolSize = 5)]属性,我猜。 - Alexander Schmidt
2个回答

15

“池化”取决于使用的传输协议。对于HTTP,WCF默认使用HTTP持久连接,它们存在短暂的时间(在100秒不活动后将被关闭),并且可以被后续请求重用(甚至来自不同的代理实例)。对于TCP和命名管道,WCF提供了内置池化


2
为什么要这么做呢?WCF可以使用ConcurrencyMode.Multiple接受来自一个客户端的多个请求。因此,初始化两个客户端没有太多意义。
WCF ServiceContract有三个重要的属性来控制这种行为:
InstanceContextMode:
- PerSession(为每个会话创建一个服务实例) - Single(为每个客户端创建单个实例) - PerCall(为每个调用创建一个服务实例)
ConcurrencyMode:
- Multiple(客户端可以同时进行多个调用-> 多线程) - Single(客户端只能进行一次调用,其他调用必须等待直到前面的调用完成) - Reentrant(客户端可以同时进行多个调用,我不确定具体情况,但我认为如果一个调用使用另一个wcf服务,则可以在另一个wcf服务调用完成之前处理其他调用,因此它释放在wcf服务调用期间和响应之间的锁定时间)
SessionMode:
- Allowed(客户端可以使用会话但不必使用) - NotAllowed(客户端不能使用会话) - Required(客户端必须使用会话)
大多数时候我使用InstanceContextMode.PerSession(因为Client 1无法访问Client 2服务中的变量),ConcurrencyMode.MultipleSessionMode.Required
您还可以指定可以初始化的实例数、可以进行的并发调用数和可使用的会话数。

你应该花更多的时间来格式化你的回答。很少有人会阅读格式不良的回答(因此你会得到更少的赞)。 - jgauffin
你的回答和问题有什么关系?会话、实例上下文模式和并发模式与重用传输连接无关 - 这就是连接池存在的原因。即使使用了你提到的所有内容,连接池仍然可以在底层使用以提高性能。 - Ladislav Mrnka
我的回答与他的示例有关,因为他正在打开两个客户端。所以我认为对他有用。 - RaphaelH
@RaphaelH 我的例子涉及控制器中的两个不同操作,因此不能在客户端使用,因为它们处于不同的作用域。 - kseen
顺便问一下,@RaphaelH, InstanceContextMode 的哪种模式更适合性能: PerSession 还是 Single?我认为显然 Single 模式比这两种慢。 - kseen
在我看来,这取决于情况。如果您的服务变量是每个客户端的,则PerSession很有用。如果您只有一个Single,则每个客户端都可以访问相同的变量。但是您不必忘记,PerSession会为每个客户端创建另一个服务实例,而PerCall则会为每个调用创建一个实例。这可能会消耗您的资源!http://www.codeproject.com/KB/WCF/WCFConcurrency.aspx 这是一篇很棒的文章! - RaphaelH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接