4

我目前正在.NET 4.5 vs 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 },
        },
};
4

2 回答 2

3

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

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

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

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

于 2013-05-22T16:58:26.427 回答
0

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

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

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

于 2013-07-09T15:09:05.003 回答