我使用PHP 5.3创建了一个基于WSDL的SOAP Web服务。我正在使用Zend Framework来处理服务,而ZF依次是PHP的内置SoapServer类。
在使用SoapUI进行测试时,我发现传递无效类型的参数(例如,在WSDL定义整数时传递字符串)会导致空响应。深入研究代码,我发现当ZF调用SoapServer-> handle()时,执行会因此致命错误而死:
Fatal error: SOAP-ERROR: Encoding: Violation of encoding rules
错误是有道理的,但对于我的生活,我无法弄清楚如何捕捉它,以便我可以优雅地处理它。我的理解是handle()应该抛出异常,但它只是简单地死了。
但是这里真的很奇怪......
使用SoapUI运行多个测试,而不进行任何代码更改,会产生不同的结果。大多数时候,我得到空洞的回应,但偶尔,我会回到SoapFault(我期待的!)。然而,这并不一致,我无法弄清楚是什么触发它。据我所知,我关闭了SoapUI中的缓存功能,以及WSDL缓存。我不知道它是否与SoapUI或PHP有关。正如我所说,很奇怪。
相关,我发现了这个旧的PHP错误:
这听起来像我自己的问题。但是,我并不完全相信这是我的问题,主要是因为涵盖所有这些的PHP文档以及ZF的文档都非常不完整。因此,我可能只是做一些非常错误而且不知道的事情。鉴于此,我很乐意看到一个简单的shell,它显示了陷阱和处理错误的正确方法。但我会接受那里的人可能提供的任何帮助。
答案 0 :(得分:1)
您可以尝试评论:https://bugs.php.net/bug.php?id=50547#1298563236(页面上的第三条评论)?
Xdebug可能是个问题。在调用之前使用xdebug_disable()时 handle()方法,服务器使用适当的SOAP消息进行响应 出了点问题。
我有完全相同的问题(有时是空响应,有时是正确的SoapFault)。 xdebug_disable()
救了我。
答案 1 :(得分:0)
如果发送错误的XML,Zend Framework会发送SoapFault异常:
// Zend/Soap/Server.php line 818
try {
$this->_setRequest($request);
} catch (Zend_Soap_Server_Exception $e) {
$setRequestException = $e;
}
使用此代码,只有Exception被转换为SoapFault。 但是所有PHP错误都不会抛出异常,而SoapServer也不会显示错误:
// Zend/Soap/Server.php line 857
protected function _initializeSoapErrorContext()
{
$displayErrorsOriginalState = ini_get('display_errors');
// Delete this line to view error in developement
ini_set('display_errors', false);
set_error_handler(array($this, 'handlePhpErrors'), E_USER_ERROR);
return $displayErrorsOriginalState;
}
我不知道如何一直返回SoapFault。抱歉。 我正在寻找...;)