我遇到了解决这个问题的麻烦。我有一个带有3个模块的APP,它们通过SOAP提供不同的服务。会发生什么事情,其中2人得到了这样的回应:
的SOAPFault
文件: /var/www/empreendimentos/vendor/zendframework/zendframework/library/Zend/Soap/Client.php:10
消息: 程序不存在
我已经仔细检查了,函数的名称是正确的,我使用方法getFunctions。这是getFunctions()的返回:
array
0 => string 'Array getCliAll(anyType $filter)' (length=32)
1 => string 'Array insertCli(anyType $data)' (length=30)
2 => string 'Array editCli(anyType $data, anyType $id)' (length=41)
3 => string 'void setServiceLocator(anyType $serviceLocator)' (length=47)
4 => string 'void getServiceLocator()' (length=24)
我的句柄方法如下:
public function handleWSDL() {
$autodiscover = new AutoDiscover();
$autodiscover->setClass('\Cli\Service\CliService');
$autodiscover->setUri($this->_URI);
$wsdl = $autodiscover->generate();
$wsdl = $wsdl->toDomDocument();
// geramos o XML dando um echo no $wsdl->saveXML()
echo $wsdl->saveXML();
}
public function handleSOAP() {
$soap = new \Zend\Soap\Server($this->_WSDL_URI);
$soap->setWSDLCache(false);
$classHandle = new CliService();
$classHandle->setServiceLocator($this->getServiceLocator());
$soap->setClass($classHandle);
$soap->handle();
}
我在服务器端没有错误。所有方法只有这个响应。有什么问题?
更新:
原来这是ZF2配置的“问题”。超载。我有我的modile.config.php来保存我的WSDL和URI信息,但是对文件的配置使用了相同的标签。重载使每个WSDL和URI都相同,并给我带来了问题。
像这样:
Emp Module modile.config.php
'service_url' => array(
"wsdl" => 'http://localhost/empreendimentos/public/emp/service?wsdl',
"return" => 'http://localhost/empreendimentos/public/emp/service',
),
Emp Module modile.config.php
'service_url' => array(
"wsdl" => 'http://localhost/empreendimentos/public/cli/service?wsdl',
"return" => 'http://localhost/empreendimentos/public/cli/service',
),
任何人都知道为什么会这样吗?它是否适用于混合模块配置?
答案 0 :(得分:1)
昨天遇到这个问题,发现答案是在服务器wsdl调用。
服务器调用自己的wsdl来内省可用的方法。如果你的wsdl url是错误的,它会看到另一台服务器上有哪些方法可用,并说'Procedure not present'。
在我的情况下,AdmintoolsController有行
$wsdl_url = 'http://' . $_SERVER['HTTP_HOST'] . '/news/?wsdl';
所以它正在新闻服务中查找该方法。
将其更改为
$wsdl_url = 'http://' . $_SERVER['HTTP_HOST'] . '/admintools/?wsdl';
它工作正常。
我搜索谷歌几个小时寻找这个修补程序,我的同事看了看代码并立即发现它。
希望这有帮助
约翰
答案 1 :(得分:1)
还尝试进行以下更改,然后检查是否有效:
phpSettings.soap.wsdl_cache_enabled = 0
。