我目前正在.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 },
},
};
答案 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补丁正常运行。