У меня возникли серьезные проблемы для решения этой проблемы. Я получил 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 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', ),
Кто-нибудь знает, почему это так? это значит, что нужно смешивать конфигурации модулей?
Если бы эта проблема была вчера, нашла ответ на вызов сервера wsdl.
Сервер вызывает свой собственный wsdl для анализа доступных методов. Если ваш URL-адрес wsdl ошибочен, он видит, какие методы доступны на другом сервере, и говорит «Процедура не присутствует».
В моем случае у AdmintoolsController была строка
$wsdl_url = 'http://' . $_SERVER['HTTP_HOST'] . '/news/?wsdl';
поэтому он смотрел в службе новостей для метода.
Измените его на
$wsdl_url = 'http://' . $_SERVER['HTTP_HOST'] . '/admintools/?wsdl';
и он отлично работает.
Я искал Google в течение нескольких часов, чтобы найти это исправление, и мой коллега посмотрел на код и сразу заметил его.
Надеюсь это поможет
Джон
Также попробуйте сделать следующие изменения, а затем проверьте, работает ли это:
phpSettings.soap.wsdl_cache_enabled = 0
в файле application.ini.