我尝试创建一个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.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;
}
请参阅:此来源
例外:
{"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# 连接到nusoap
Web 服务器时。禁用查找其他文件/类中定义的方法。
解决方案:在编写 Web 服务时在同一文件中定义所有方法
请参阅:此来源
注意:如果您知道解决此问题的方法,并让我们在其他文件/类中定义方法(=使代码更清晰),请对其进行注释。
例外:
{"反序列化操作的回复消息正文时出错 '方法 名称'."}
原因:可能有不同的原因,但就我而言,当尝试使用数组作为返回结构的属性时会发生。C# 会将字符串数组视为字符串。
解决:我使用基本类型解决了它。
注意:如果您知道更好的方法,请发表评论