PHP SoapClient: проблемы с распределенным файлом WSDL - PullRequest
4 голосов
/ 26 февраля 2010

У меня проблема с использованием распределенного файла WSDL (схемы / другие определения объявлены вне фактического WSDL) с PHP SoapClient.

Это сообщение об ошибке, которое я получил:

SOAP-ERROR: Parsing WSDL:  'getSomeInfo' already defined.

После некоторого поиска в Google, похоже, ошибка внутри PHP, поскольку кто-то другой обнаружил точно такую ​​же проблему: http://bugs.php.net/bug.php?id=45282

Были ли исправлены ошибки? Любое решение, чтобы обойти эту ошибку?

Я думаю, что публиковать фрагмент кода бессмысленно, так как вызов SoapClient ctor с использованием только WSDL - единственный сбой.

Ответы [ 4 ]

2 голосов
/ 24 апреля 2015

У меня была такая же проблема. Проблема была в wsdl и импорте, я сохранил wsdl с сайта и указал soapclient использовать локальный файл, но все ссылки были оригинальными. Мыльный клиент каждый раз получает файл с удаленного хоста, переходит на части, а с них обратно в тот же файл, но на удаленный диск. Это привело к тому, что один и тот же файл загружался дважды. Решение состоит в том, чтобы использовать только удаленные файлы или переписать пути к локальным (все). SoapUI делает это, когда вы нажимаете «экспортировать определения» в проекте wsdl. Надеюсь, что это поможет другим.

0 голосов
/ 28 февраля 2010

Скачать локальную копию файла WSDL. Удалить дубликаты имен методов. Обновите ваш мыльный клиент, чтобы использовать локальный файл WSDL. Это работало хорошо для меня в прошлом.

0 голосов
/ 24 июня 2011

У меня была такая же проблема при доступе к службе WCF, предоставляющей несколько конечных точек через PHP. В моем случае оказалось, что основной WSDL импортирует sub-WSDL для каждой конечной точки, в то время как sub-WSDL, в свою очередь, включают основной WSDL. Это, очевидно, причина, по которой PHP читает main-WSDL дважды и выдает «уже определенный» - ошибку. Я мог бы избежать этого, создав клиент с URL-адресом ниже WSDL желаемой конечной точки вместо основного URL-адреса WSDL.

0 голосов
/ 27 февраля 2010

Исходный код PHP ( svn ), который заботится об узлах import, содержит комментарий /* TODO: namespace ??? */. Пространства имен игнорируются, что позволяет конфликтам методов происходить.

Предлагаются три решения:

  1. Исправить исходный код для обслуживания пространств имен (который будет очень Добро пожаловать)
  2. Манипулировать файлами WSDL, чтобы предотвратить наложение такого метода (это вероятно , а не опция вообще)
  3. Вместо того чтобы использовать исходный файл WSDL, вызывайте импортированные файлы по отдельности (или групповые, у которых нет конфликтов имен методов) с отдельными экземплярами SoapClient.

Извините, что больше не могу помочь.

...