我的公司目前正在从传统的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 Webservice连接速度要慢得多。
连接到WCF Web服务时,有没有办法(显着)提高性能?
更新:
有关WCF客户端的一些信息。 在IIS 7,Windows Server 2008上托管。 使用BasicHttpBinding(因为PHP SoapClient不支持更复杂的wsHttpBinding)。 连接使用ssl。
此外,当通过WCFStorm连接时,连接速度要快得多,这让我相信这个问题可能与PHP SoapClient有关。
答案 0 :(得分:1)
根据您在问题中的WCFStorm评论,只是一个猜测,可能是ASMX版本生成的WSDL可能比服务的WCF版本更容易解析。我不知道PHP SoapClient是否从WSDL动态创建代理,但如果ASMX与WCF生成的WSDL明显不同,那么可能会导致最初的瓶颈。
答案 1 :(得分:1)
我们的问题已通过在php.ini中修复soap.wsdl_cache_dir
的位置来解决。
我们的网站是在Windows机器上托管和开发的,因此默认目录'/ tmp'不起作用。将此更改为C:\ Windows \ Temp意味着虽然初始连接仍然很慢,但所有后续请求都很快。
我们现在将研究使用更常见的预热脚本解决方案。