尝试从 C# 连接 nusoap Web 服务时出现错误 {"Element 'faultstring' with namespace name '' was not found. Line 6, position 126."}

error {"Element 'faultstring' with namespace name '' was not found. Line 6, position 126."} when try to connect nusoap web service from C#

我尝试创建一个 nusoap Web 服务(我使用 xampp 和 .net beans)并使用 C# 应用程序连接到它(使用 visual studio)。但我遇到了这个错误:

{"Server returned an invalid SOAP Fault. Please see InnerException for more details."}

内部错误为:

{"Element 'faultstring' with namespace name '' was not found. Line 6, position 126."}

按照 this source 的建议,我更改了 class.soap_fault.php 文件中 function serialize() 的属性顺序,但它仍然给出相同的错误。

我尝试重新启动计算机,所以我现在不是问题。

此外,我在 nusoap 库中所做的唯一其他更改是将 nusoap.php 文件中的 var $soap_defencoding = 'ISO-8859-1'; 更改为 var $soap_defencoding = 'UTF-8'; 以解决编码问题。

在 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;
    }

我原以为更改属性顺序可以解决问题,但我仍然收到同样的错误。我搜索了很多但找不到任何其他解决错误的方法。

由于我不知道的原因,在两个不同的文件中有两个具有相同主体的 function serialize() 的定义。一个在 class.soap_fault.php 中,另一个在 nusoap.php 中,您需要更改第二个 (nusoap.php) 中的方法体。不知道有没有什么条件需要换其他的。


对于可能达到此目的的其他人post我添加一些您可能遇到的问题以及他们解决的问题:

异常:

Encodes were different (windows uses 'utf-8' and this uses 'ISO-8859-1')

原因:服务器和客户端的编码类型不同。

解决:在 nusoap.php 文件中将 var $soap_defencoding = 'ISO-8859-1'; 更改为 var $soap_defencoding = 'UTF-8';

参见:这个source


异常:

Server returned an invalid SOAP Fault. Please see InnerException for more details

内部:

Element ‘faultstring’ with namespace name ” was not found. Line 6, position 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;
}

参见:这个source


异常:

{"error in msg parsing:\nxml was empty, didn't parse!"}

原因:以下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"));

参见:这个source


异常:

{"method ''('function name here'('function name here') not defined in service('' '')"}

或简单地:

method '' not defined in service.

原因:使用 C# 连接到 nusoap 网络服务器时。无法查找其他 files/classes.

中定义的方法

解决:在编写web service时在同一个文件中定义所有方法

参见:这个source

注意:如果您知道解决此问题的方法并在其他 files/classes 中定义方法(= 使代码更清晰),请发表评论。


异常:

{"Error in deserializing body of reply message for operation 'method name'."}

原因:可能有不同的原因,但在我的例子中,当尝试使用数组作为返回结构的 属性 时发生。 C# 会将字符串数组视为字符串。

解决:我用基本类型解决了

注意:如果你知道更好的方法请评论