在.NET 4.5中超过4.0大量增加了新的TCP连接#?

时间:2013-05-15 09:51:09

标签: c# wcf .net-4.0 tcp .net-4.5

我目前正在.NET 4.5 vs 4.0中测试我的WPF / WCF客户端应用程序,最终将4.5推出到所有客户端计算机。 WCF部分使用BasicHttpBinding / SOAP。

在相同条件(Win7等)下测试两个客户端版本时,我们看到SOAP服务器端点的“新TCP连接”增加了10倍 - 4.0个客户端每小时建立~450个,而4.5个客户端正在建立〜 6000。由于我们连接到远程服务器,这很麻烦,因为建立新的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 },
        },
};

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

使用这些修补程序解决了此问题:

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

我们验证了Win7补丁正常运行。