尝试从 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# 会将字符串数组视为字符串。
解决:我用基本类型解决了
注意:如果你知道更好的方法请评论
我尝试创建一个 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# 会将字符串数组视为字符串。
解决:我用基本类型解决了
注意:如果你知道更好的方法请评论