XML 文档(2, 309)中有错误。未经处理的异常在 System.Xml.dll 中发生 。

woeser 2013-11-22 09:54:14
最近在学习WCF,项目要用WCF做服务端。但WCF不仅仅是服务端,因为也会调用gsoap生成的C++客户端里的一些函数,所以现在的状态是WCF和C++互为服务端和客户端。

问题出在WCF远程调用C++的"math"函数时,想传入2个int型(x和y),返回3个字符串,抓包看到传入和返回都没问题,但是WCF停在这里的this.Invoke这句:
public stringarray math(int x, int y) {
object[] results = this.Invoke("math", new object[] {x, y});
return ((stringarray)(results[0]));
提示:
“System.InvalidOperationException”类型的未经处理的异常在 System.Xml.dll 中发生。
其他信息: XML 文档(2, 309)中有错误。

实际上返回的xml包是没问题的:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns2="urn:dslforum-org:cwmp-1-1">
<SOAP-ENV:Body>
<ns2:mathResponse>
<result SOAP-ENC:arrayType="xsd:string[3]" xsi:type="SOAP-ENC:Array">
<string>GetRPCMethods</string>
<string>GetParameterValues</string>
<string>SetParameterValues</string>
</result>
</ns2:mathResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

前面还试过,传入两个int值,返回两个int值,是可以的。请问前辈们,这种问题该如何处理?
...全文
556 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
woeser 2013-11-22
  • 打赏
  • 举报
回复
刚才试,返回单个字符串也是这个问题,但是整型就没问题,这到底是怎么回事呢?两边都是UTF-8格式编码了。
woeser 2013-11-22
  • 打赏
  • 举报
回复
找到问题了,是WCF不支持SOAP规范里的数组定义,要改成符合WS-I规范的就可以了。 在WSDL声明此type的时候默认采用的是soapenc:Array的方式,这也是SOAP规范中的方式;其声明部分如下: <xs:complexType name="ArrayOfSimpleUserInfo"> <xs:complexContent> <xs:restriction base="soapenc:Array"> <xs:attribute ref="soapenc:arrayType" wsdl:arrayType="ns1:SimpleUserInfo[]"></xs:attribute> </xs:restriction> </xs:complexContent> </xs:complexType> 该声明方式在和大部分的客户端语言联调时没有问题,比如Java、.Net WSE 2.0、.Net WSE 3.0、Php;但是在利用WCF进行联调时就出现了问题。 以上引用自: http://blog.csdn.net/sfdev/article/details/2314781 感谢版主的热心回复~
woeser 2013-11-22
  • 打赏
  • 举报
回复
引用 4 楼 qiujialongjjj 的回复:
嗯,wcf是可以返回string类型的,因为看不到源代码,所以我也不敢肯定,还是要楼主耐心仔细的检查下代码
返回一个字符串的例子找到问题了,有个叹号写成了中文的。 返回三个字符串的例子还是不行,我字符串里都没有用标点。在想是不是C++这边定义的字符串数组WCF那边认不得?C++的字符数组是wsdl里引用的xsd文件里的这段生成的: <xs:complexType name="stringarray"> <xs:complexContent> <xs:restriction base="soapenc:Array"> <xs:sequence> <xs:element name="string" maxOccurs="unbounded"> <xs:simpleType> <xs:restriction base="xs:string"> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute ref="soapenc:arrayType" use="required"/> </xs:restriction> </xs:complexContent> </xs:complexType> 还是说wsdl里可以直接定义数组? 麻烦看到的朋友把您认为的可能的原因写给我,小女子真的是绞尽脑汁了,先谢过了。
风一样的大叔 2013-11-22
  • 打赏
  • 举报
回复
嗯,wcf是可以返回string类型的,因为看不到源代码,所以我也不敢肯定,还是要楼主耐心仔细的检查下代码
woeser 2013-11-22
  • 打赏
  • 举报
回复
引用 2 楼 qiujialongjjj 的回复:
会不会是C#和C++中xml格式不同照成的?这么说只能用int而不能用string了?
谢谢版主回复,既然能返回int,应该不是xml格式不同造成的,您觉得呢?还是WCF这边有问题,不至于连个string也传不过来吧。
风一样的大叔 2013-11-22
  • 打赏
  • 举报
回复
会不会是C#和C++中xml格式不同照成的?这么说只能用int而不能用string了?

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧