ошибка {"Элемент 'faultstring' с именем пространства имен '' не найден. Строка 6, позиция 126."} при попытке подключиться к веб-службе nusoap из C # - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь создать веб-сервис nusoap (я использую beam-компоненты xampp и .net) и подключиться к нему с помощью приложения на C # (используйте visual studio). но я сталкиваюсь с этой ошибкой:

{"Сервер вернул недопустимую ошибку SOAP. Дополнительные сведения см. В разделе InnerException."}

Внутренняя ошибка:

{"Элемент 'faultstring' с именем пространства имен '' не найден. Строка 6, позиция 126."}

Поскольку этот источник предложил, я изменил порядок свойств для function serialize() в файле class.soap_fault.php, но он все еще выдает ту же ошибку.

Я попытался перезагрузить компьютер, поэтому теперь у меня нет проблем с перехватом.

Также единственным другим изменением, которое я сделал в библиотеке nusoap, было изменение var $soap_defencoding = 'ISO-8859-1'; на var $soap_defencoding = 'UTF-8'; в nusoap.php файле для решения проблемы кодирования.

в C # У меня есть следующий код:

SR1.demoPortTypeClient client = new SR1.demoPortTypeClient();
var result = client.gettext("hello");
MessageBox.Show("*" + result + "*");

и в php:

<?php
require 'lib/nusoap.php';
$server=new nusoap_server();
$server->configureWSDL("demo");
$namespace = "demo";
$server->wsdl->schemaTargetNamespace = $namespace;
$server->register(
        "gettext",//name of function
        array("txt"=>'xsd:string'),//inputs
        array("return"=>'xsd:string'),//outputs
        $namespace,// namespace
        false,// soapaction (use default)
        'rpc',// style: rpc or document
        'encoded',// use: encoded or literal
        'Return same text'// description for method
        );

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

где gettext функция:

<?php
function gettext($txt)
{
    return $txt;
}

текущий 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;
    }

Я ожидал, что изменение порядка свойств решит проблему, однако я все еще получаю ту же ошибку. Я много искал, но не мог найти другое решение для ошибки.

1 Ответ

0 голосов
/ 06 мая 2019

По причине, которую я не знаю, есть два определения для 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 # будет видеть массив строк как строку.

Решить: Я решил это, используя базовые типы.

Примечание: если вы знаете лучший способ, пожалуйста, прокомментируйте его

...