【问题标题】:Massively increased new TCP connections # in .NET 4.5 over 4.0?.NET 4.5 中的新 TCP 连接数量比 4.0 大幅增加?
【发布时间】: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


【解决方案1】:

这是由于修复不同问题时引入的回归。它与来自服务器的分块传输编码响应有关。

对于直接使用 HttpWebRequest 的用户,您可以通过确保您的应用程序读取整个响应流来解决此问题。这意味着您需要在流上调用 Read 或 BeginRead 方法,直到它返回 0 作为读取的字节数。

对于那些使用 WCF 等包装技术的用户,在客户端没有已知的解决方法。如果您有权访问服务器,则可以更改您的服务器以发送基于内容长度的响应而不是分块响应,这应该可以让您避免出现问题的代码路径 客户。

已确定此问题的修复程序,并将在即将更新的框架中广泛发布。如果这阻止了您,请联系 Microsoft 客户支持。

【讨论】:

  • 谢谢@JonCole。我们等待框架更新,并将安装一个反向代理来解决 3 次握手延迟问题(以及我们将从中获得的其他好处)。
  • @jamespconnor 如果这阻止了您,您可以联系 Microsoft 支持以获取 KB2846046。
  • 嗨@Varun,除了简要提及Win8 修补程序外,我在网上任何地方都找不到该KB 的详细信息? KB2846046 是针对此问题的某种修复吗?我们在工作站上使用 Win7。
  • 现在找到了 - support.microsoft.com/kb/2846046 但似乎只适用于 Windows 8?
【解决方案2】:

通过以下修补程序修复了此问题:

Win7:http://support.microsoft.com/kb/2846044 Win8:http://support.microsoft.com/kb/2846046

我们验证了 Win7 补丁可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 2010-09-17
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2014-01-21
    • 2013-09-14
    • 2013-09-24
    相关资源
    最近更新 更多