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



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

{"服务器返回了无效的 SOAP 错误。 有关更多详细信息,请参阅 InnerException。

内在的错误是:

{"找不到具有命名空间名称"的元素'错误字符串'。第 6 行,位置 126。

正如该来源所建议的那样,我更改了文件中function serialize()的属性顺序class.soap_fault.php但它仍然给出相同的错误。

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

此外,我在 nusoap 库中所做的唯一其他更改是将var $soap_defencoding = 'ISO-8859-1';更改为nusoap.php文件中的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)中更改方法主体。我不知道是否有任何条件需要更改其他条件。


对于可能到达这篇文章的其他人员,我添加一些您可能会遇到的问题及其解决方案:

例外:

编码是不同的(Windows使用"utf-8",这使用。 "ISO-8859-1")

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

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

请参阅:此来源


例外:

服务器返回了无效的 SOAP 错误。请参阅内部例外 更多详情

内:

找不到具有命名空间名称 " 的元素"错误字符串"。6号线, 位置 126

原因:故障属性顺序的差异

解决:nusoap.phpfunction 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;
}

请参阅:此来源


例外:

{"msg 解析中的错误:xml 为空,未解析!"}

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

请参阅:此来源


例外:

{"方法 ''('函数

名称在这里'('函数名称在这里') not 在服务('' '')"} 中定义

或者简单地:

服务中未定义方法 ''。

原因:使用 C# 连接到nusoapWeb 服务器时。禁用查找其他文件/类中定义的方法。

解决方案:在编写 Web 服务时在同一文件中定义所有方法

请参阅:此来源

注意:如果您知道解决此问题的方法,并让我们在其他文件/类中定义方法(=使代码更清晰),请对其进行注释。


例外:

{"反序列化操作的回复消息正文时出错 '方法 名称'."}

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

解决:我使用基本类型解决了它。

注意:如果您知道更好的方法,请发表评论

最新更新