连接到 WCF Web 服务的速度非常慢


Connecting to WCF Web Service is inexplicably slow

我的公司目前正在从传统的 ASMX Web 服务过渡到 WCF Web 服务,因为我们需要改进对 WCF 提供的复杂类型的处理。

在调查网页的性能问题时,我发现最大的(在某种程度上)性能天坑是与 WCF 服务的初始连接。当我说初始时,我的意思是以下一段代码,每次调用它时,页面刷新就足以获得慢速连接:

$client = new SoapClient("<address-to-webservice>",
array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));

对此 Web 服务中的方法的后续调用很快,但连接速度却莫名其妙地慢了。

在同一页面上,有一个与托管在同一服务器上的 ASMX 服务的连接,该服务的连接速度要快得多。

Connection to WCF Webservice took 1.6509809494019 seconds //(this is just calling new SoapClient)
Connection to ASMX Webservice took 0.24430394172668 seconds
Calling ASMX->Method
ASMX->Method returned in 0.011564970016479 seconds
Calling WCF->Method1
WCF->Method1 returned in 0.011118173599243 seconds
Calling WCF->Method2
WCF->Method2 returned in 0.0038959980010986 seconds
Calling WCF->Method3
WCF->Method3 returned in 0.0041651725769043 seconds

这是在内部网络上运行的,显然从外部连接的速度更慢。如您所见,WCF Web 服务连接速度要慢得多。

有没有办法在连接到 WCF Web 服务时(显著)提高性能?

更新:

有关 WCF 客户端的一些信息。托管在 IIS 7,Windows Server 2008 上。使用 BasicHttpBinding(因为 PHP SoapClient 不支持更复杂的 wsHttpBinding)。连接正在使用 SSL。

此外,当通过WCFStorm连接时,连接速度要快得多,这让我相信问题可能出在PHP SoapClient上。

只是根据问题中的 WCFStorm 注释进行猜测,可能是 ASMX 版本生成的 WSDL 可能比服务的 WCF 版本更容易分析。我不知道 PHP SoapClient 是否从 WSDL 动态创建代理,但如果 ASMX 和 WCF 生成的 WSDL 明显不同,那么这可能会导致最初的瓶颈。

通过在 php.ini 中修复soap.wsdl_cache_dir的位置,我们的问题已经得到解决。

我们的网站是在Windows机器上托管和开发的,因此默认目录"/tmp"不起作用。将其更改为 C:''Windows''Temp 意味着尽管初始连接仍然很慢,但所有后续请求都很快。

我们现在将研究使用更常见的预热脚本解决方案。