【发布时间】:2013-05-15 09:51:08
【问题描述】:
我目前正在 .NET 4.5 与 4.0 中测试我的 WPF/WCF 客户端应用程序,以期最终将 4.5 推广到所有客户端计算机。 WCF 部分使用 BasicHttpBinding/SOAP。
在相同条件下(Win7 等)测试两个客户端版本时,我们发现到 SOAP 服务器端点的“新 TCP 连接”增加了 10 倍 - 4.0 客户端每小时建立约 450 个客户端,而 4.5 客户端正在建立 ~ 6,000。由于我们要连接到远程服务器,这很麻烦,因为建立新的 TCP 连接会给 Web 服务调用增加很大的延迟。
在使用 4.0 时,我们之前已调整客户端 ServicePointManager 设置以最大化我们的 TCP 连接重用,并希望这些设置适用于 4.5。
我的应用程序通常一次执行一个调用,可能平均每 10 秒执行一次 - 每隔几分钟就会爆发 10 个并发调用。
我查看了更改日志,但找不到对 .NET 的这一部分所做的修复/更改的任何引用。谁能解释一下这里可能发生了什么?
ServicePointManager.UseNagleAlgorithm = true;
ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 50;
ServicePointManager.MaxServicePointIdleTime = 10000;
Binding binding = new BasicHttpBinding
{
SendTimeout = TimeSpan.FromSeconds(_settings.SendTimeout),
ReceiveTimeout = TimeSpan.FromSeconds(_settings.SendTimeout),
MaxReceivedMessageSize = 1024 * 1024 * 10,
MaxBufferSize = 1024 * 1024 * 10,
MaxBufferPoolSize = 1024 * 1024 * 100,
Security =
{
Mode = BasicHttpSecurityMode.TransportCredentialOnly,
Message = { ClientCredentialType = BasicHttpMessageCredentialType.UserName },
Transport = { ClientCredentialType = HttpClientCredentialType.Basic },
},
};
【问题讨论】:
-
也许您的问题与此有关? - support.microsoft.com/kb/2538826 问题可能与分配线程以处理客户端请求的方式有关。
-
@Xefan 有趣的一点,但该链接指的是服务器端问题,而不是上面与客户端连接相关的点(服务器不是 WCF 并且没有更改)。
-
服务器发送分块响应是偶然的吗?有一个已知问题,分块响应可能导致连接关闭而不是重用。
-
@JonCole 这是 .Net 4.5 的一个已知问题,即 .Net 4.0 客户端不会出现此问题吗?
-
@JonCole 我们已经确定该服务正在发送 Transfer-Encoding: 分块且未指定 Content-Length 标头。我们正在调查为什么他们启用了分块编码,但与此同时,这是否是我们在 .NET 4.0 和 4.5 之间看到的行为差异的原因?该服务还使用 gzip 编码发送响应。
标签: c# wcf .net-4.0 tcp .net-4.5