c# - .NET 4.5 超过 4.0 时大量增加了新的 TCP 连接数?

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

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

最佳答案

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

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

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

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

关于c# - .NET 4.5 超过 4.0 时大量增加了新的 TCP 连接数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561883/

相关文章:

c# - 是否有可能在C#中的同一线程上同时运行两个任务?

c# - 更改中继器中链接按钮的文本

c# - 对 WCF 的 Ajax 调用返回 "The incoming message has an unexpected message format ' Raw'。操作的预期消息格式.."

wpf - WPF 中的 .NET Framework 4 不显示位图效果

c# - 具有两个 PUT 方法的 Web API Controller 抛出 InvalidOperationException

c# - 如何自动滚动 ScrollViewer - 仅当用户未更改滚动位置时

asp.net - 如何在我的网站上托管我的 WCF 服务?

wcf - 如何使用共享 key 限制对 WCF 服务的访问

.Net 4 Task的调度澄清?

wpf - WPF ResourceDictionary 中 StaticResource 的范围是什么?