По причине, которую я не знаю, есть два определения для function serialize()
с одним и тем же телом в двух разных файлах.Один в class.soap_fault.php
и другой в nusoap.php
, и вам нужно изменить тело метода во втором (nusoap.php
).Я не знаю, есть ли какое-либо условие, которое вам нужно изменить, или нет.
Для тех, кто может попасть на этот пост, я добавляю некоторые проблемы, с которыми вы можете столкнуться, и решаю их:* Исключение:
Кодировки были разными (в Windows используется 'utf-8', а для этого используется 'ISO-8859-1')
Причина: тип кодировки различен всервер и клиент.
Решить: В nusoap.php
изменение файла var $soap_defencoding = 'ISO-8859-1';
на var $soap_defencoding = 'UTF-8';
См .: этот источник
Исключение:
Сервер вернул недопустимую ошибку SOAP.Пожалуйста, смотрите InnerException для более подробной информации
Inner:
Элемент 'faultstring' с именем пространства имен ”не найден.Строка 6, позиция 126
Причина: разница в порядке свойств ошибок
Решить: в nusoap.php
изменить function serialize()
на следующее:
function serialize() {
$ns_string = '';
foreach( $this->namespaces as $k => $v ) {
$ns_string .= "\n xmlns:$k=\"$v\"";
}
$return_msg =
'<?xml version="1.0" encoding="' . $this->soap_defencoding . '"?>' .
'<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"' . $ns_string . ">\n" .
'<SOAP-ENV:Body>' .
'<SOAP-ENV:Fault>' .
$this->serialize_val( $this->faultcode, 'faultcode' ) .
$this->serialize_val( $this->faultstring, 'faultstring' ) .
$this->serialize_val( $this->faultactor, 'faultactor' ) .
$this->serialize_val( $this->faultdetail, 'detail' ) .
'</SOAP-ENV:Fault>' .
'</SOAP-ENV:Body>' .
'</SOAP-ENV:Envelope>';
return $return_msg;
}
См .: этот источник
Исключение:
{"ошибка при разборе сообщения: \ nxml был пуст, не проанализирован!"}
Причина: следующая функция php недействительна в текущей версии:
решить: использовать следующий код для версии php 5.6.0 до версии 7.0.0
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
$server->service($POST_DATA);
и для версии 7.0.0 и более поздних версий:
@$server->service(file_get_contents("php://input"));
См .: Этот источник
Исключение:
{"method '' (' имя функции здесь ' (' имя функции здесь ') не определено в сервисе ('' '')"}}
или просто:
метод '' не определен в службе.
Причина: при использовании C # для подключения к веб-серверу nusoap
.найти методы, определенные в других файлах / классах.
Решить: определить все методы в одном и том жефайл при написании веб-службы
См .: Этот источник
Примечание. Если вы знаете способ решения этой проблемы и позвольте определять методы в других файлах / классах (=сделать более чистый код), пожалуйста, прокомментируйте его.
Исключение:
{"Ошибка десериализации тела ответного сообщения для операции ' имя метода '."}
Причина: могут быть разные причины, но в моем случае это происходит при попытке использовать массивы в качестве свойства для возвращаемой структуры.C # будет видеть массив строк как строку.
Решить: Я решил это, используя базовые типы.
Примечание: если вы знаете лучший способ, пожалуйста, прокомментируйте его