5

我很难解决这个问题。我有一个带有 3 个模块的应用程序,这些模块由 SOAP 提供不同的服务。发生的情况是其中 2 人得到了以下响应:

肥皂故障

文件:/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 模块 modile.config.php

'service_url' => array(
    "wsdl" => 'http://localhost/empreendimentos/public/emp/service?wsdl',
    "return" => 'http://localhost/empreendimentos/public/emp/service',
),

Emp 模块 modile.config.php

'service_url' => array(
"wsdl" => 'http://localhost/empreendimentos/public/cli/service?wsdl',
"return" => 'http://localhost/empreendimentos/public/cli/service',
),

有谁知道为什么会这样?是否应该混合模块配置?

4

2 回答 2

1

还尝试进行以下更改,然后检查它是否有效:

  1. 删除zend 服务器的tmp文件夹中以“ wsdl- ”开头的文件。
  2. 进行 php 设置:phpSettings.soap.wsdl_cache_enabled = 0在您的 application.ini 文件中。
于 2013-10-28T13:54:18.217 回答
1

昨天有这个问题,发现答案在服务器wsdl调用中。

服务器调用自己的 wsdl 来内省可用的方法。如果您的 wsdl url 错误,它会查看其他服务器中可用的方法并显示“程序不存在”。

在我的情况下,AdmintoolsController 有这条线

$wsdl_url = 'http://' . $_SERVER['HTTP_HOST'] . '/news/?wsdl';

所以它在新闻服务中寻找该方法。

将其更改为

$wsdl_url = 'http://' . $_SERVER['HTTP_HOST'] . '/admintools/?wsdl';

它工作正常。

我在谷歌上搜索了几个小时来寻找这个修复程序,我的同事查看了代码并立即发现了它。

希望这可以帮助

约翰

于 2013-05-02T10:38:19.387 回答