带有basicHttpBinding的WCF服务是否为每个请求创建了一个新连接?

时间:2010-12-24 08:52:46

标签: silverlight wcf basichttpbinding

我有一个Silverlight客户端在IIS Web服务器上调用WCF服务。它使用默认的basicHttpBinding设置进行调用。我的客户端代码具有使用“更新服务引用”菜单选项时生成的常用Visual Studio生成的代理。

使用该代理对服务的每次调用是否都使用相同的连接?或者每次拨打电话时是否创建连接,然后在收到回复后将其关闭?由于客户端实际上通过HTTP进行SOAP调用,我只是假设每个服务请求都创建了一个新连接,但我想检查是否是这种情况?

(我需要知道,因为如果它每次都创建一个新连接,那么每个请求都可以在不同的服务器上结束,因为有几个服务器负载均衡。它在代理的持续时间内使用单个连接然后我可以假设它们都在同一台机器上运行,因此缓存状态信息以获得更好的性能。)

1 个答案:

答案 0 :(得分:6)

您必须在连接和会话之间有所不同。 Connection允许您调用服务器。会话允许您在来自同一客户端的后续请求中维护状态。例如,应用程序会话允许使用服务器端缓存。首先,BasicHttpBinding不支持会话。

HTTP 1.1规范描述了每个连接应该作为持久性打开。当您向新服务器调用第一个HTTP请求时,将建立持久连接,并且它将保持打开状态以便后续调用同一服务器。如果不再次调用服务器,则会在超时后关闭服务器。持久性连接打开和关闭在内部处理,对开发人员完全透明。

所有浏览器和HTTP API(包括.NET HttpWebRequest)都使用持久连接,因此所有基于HTTP的绑定都是如此。您可以通过使用HTTP传输通道创建自定义绑定并将属性KeepAliveEnabled设置为false来要求为每个请求/响应创建和关闭新连接。它将增加额外的开销,因为将为每个请求/响应建立新的TCP连接。建立TCP连接是一项耗时的操作。

持久性HTTP连接与WCF应用程序会话无关。默认情况下,在单个服务代理实例和单个服务实例之间处理WCF会话。来自同一代理实例的所有后续调用都由同一服务实例(PerSession实例化)处理。 WCF应用程序会话建立在任何其他会话之上 - 连接,安全,可靠。 BasicHttpBinding不支持任何这些会话类型,因此它不能使用WCF应用程序会话(和Per​​Session实例化)。默认情况下,BasicHttpBinding上公开的每个服务请求都由新服务实例(PerCall实例化)处理。

通过HTTP规范,客户端应该只能打开到同一服务器的两个并发持久HTTP连接。对于在同一时间段内从同一客户端计算机调用同一服务器的所有服务代理共享持久HTTP连接。此外,如果在调用之间经过很长一段时间,单个代理实例可以从许多不同的连接中调用服务。这就是持久HTTP连接不能用作连接会话的原因。 HTTP不是面向连接的 - 它只允许出于性能原因重用连接。

WCF中持久HTTP连接的不活动超时为100秒。我通过在Procmon中测量发现了这个超时。我有unanswered question关于将此超时设置为不同的值。

使用负载平衡时,您也不能依赖连接。在客户端和负载平衡器之间打开持久HTTP连接。但负载均衡算法的责任是选择处理服务器。在BasicHttpBinding的情况下,它可以是简单的Round Robin,因为处理服务器不会使用任何类型的会话。在面向会话的绑定的情况下,您必须使用一些具有会话亲和性的算法(粘性会话),这会将来自同一会话的所有请求转发到同一服务器,以便相同的服务实例可以处理它们。但它不是BasicHttpBinding的情况。