【问题标题】:Does a WCF service with basicHttpBinding create a new connection for each request?具有 basicHttpBinding 的 WCF 服务是否为每个请求创建一个新连接?
【发布时间】:2010-12-24 08:52:45
【问题描述】:

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

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

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

【问题讨论】:

  • 我不知道答案,但你试过追踪吗?也许是提琴手?
  • 我有提琴手,但在使用 Azure Development Fabric 从 Silverlight 客户端到 WCF 服务时,它没有显示任何内容。
  • 我已经读到最好使用 ServerIron 负载平衡器来执行诸如绑定服务器与客户端 IP 地址或会话的任务。显然Azure使用了其他负载均衡器,所以我不知道。

标签: silverlight wcf basichttpbinding


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2012-08-14
    • 1970-01-01
    • 2020-11-22
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多