webservice调用错误 Unmarshalling Error: unexpected element

belsai 2016-11-06 10:05:34
delphi7通过Import WSDL导入功能生成的接口单元文件,在调用其中的函数时发生以下错误


通过工具截取到的SOAP消息
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<GetClient xmlns="http://webservice.clini.org/">
<arg0>
<company>0001</company>
<PersonType>1</PersonType>
<Memo></Memo>
</arg0>
</GetClient>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

按要求应该是以下的格式
<?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">
<SOAP-ENV:Body>
<m:GetClient xmlns:m="http://webservice.clini.org/">
<arg0>
<company>0001</company>
<PersonType>1</PersonType>
<Memo></Memo>
</arg0>
</m:GetClient>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
红色部分就是区别,delphi要如何才能按这样的要求生成SOAP消息呢?
...全文
8740 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
奥利弗嗷 2019-02-28
  • 打赏
  • 举报
回复
谢谢楼主分享,感谢
七月在野 2018-10-10
  • 打赏
  • 举报
回复
1 down vote accepted I've managed to find a clean fix to my issue, just replace the invoke option in the initialization section of the unit from ioDocument to ioHasNamespace or ioHasAllSOAPActions and the SOAP request will be generated correctly, example: InvRegistry.RegisterInvokeOptions(TypeInfo(YourSoapInterface), ioDocument); change to InvRegistry.RegisterInvokeOptions(TypeInfo(YourSoapInterface), ioHasNamespace); or InvRegistry.RegisterInvokeOptions(TypeInfo(YourSoapInterface), ioHasAllSOAPActions); This is the cleanest fix I could find for this issue. 转来的,在D7上完美解决。在D10以上不会出错
lizjf 2016-11-10
  • 打赏
  • 举报
回复
厉害了,我的哥
lyhoo163 2016-11-10
  • 打赏
  • 举报
回复
帮顶,借鉴了。
belsai 2016-11-10
  • 打赏
  • 举报
回复
有回复的立即结贴给分
belsai 2016-11-10
  • 打赏
  • 举报
回复
经过近半个月的努力,终于解决了该问题,在此写出解决方案,希望能帮到更多的猿友们!
该项目本是在PB9中开发的,但可能因为PBDOM功能较弱?反正我是怎么折腾都不能按要求的格式生成SOAP消息,主要是函数名的前缀加不上,既然生不成SOAP消息,那就用HTTP请求的方式直接POST好了,可是PB又让我失望了,Internet功能也是个鸡肋,POST函数不能指定服务器端口!!不管怎么设置都不行!修改Header,在URL中包含端口号http://192.168.0.1:8888,结果服务器始终返回404(对PB简直太失望了)。无奈之下,只能通过delphi(本人只会用这两种工具)写个DLL进行调用生成SOAP消息吧,DELPHI的到底还是要比PB强大的多!没想到在DELPHI中不管是用webservice中的soap控件,还是通过ActiveX调MSSOAP TOOLKIT 3.0,依然不能解决函数名前缀的问题(没有前缀就会返回贴中的错误),继续换HTTP控件,用IXMLDocument生成数据的XML,用string直接生成SOAP消息封包,这才把问题给解决了!
本以为可以大功告成,没想到DELPHI也有SB的时候,解析服务器返回的XML数据时又遇到问题了,IXMLDocument的解析结果如下图


NodeName和NodeValue不在一个级别的NODE上,而且如果字段值为空就没有NodeValue,不管用IsTextElement还是HasChildNodes,都没办法循环取出完整的二维表数据,只能通过NodeName逐行逐字段的取值,这样的树型结构对后期统一处理各种结构的数据造成了太大的麻烦,个人很不喜欢这种笨办法!这时候又发现PB的好了,用PBDOM_Document就可以很方便的取出想要的数据,也没有发生NodeName和NodeValue是父子结点关系的情况,看来真是要再多学几门语言防身才好啊!或许在.net里这些都不是问题吧。
期间想查看SOAP封包消息的具体内容,需要截取HTTP消息,拿着MSSOAP TOOLKit中的 Trace Utility研究了好久,最后还是死心了,这个工具非常简单,就没几项参数需要设置,可是根本截取不到任何消息啊!难道这个东西只能放在服务器上使用吗?还是我的参数设置的不对?网上的资料也不多,不再费神研究了,因为找到了一个非常不错的HTTP消息截取软件HTTP Analyzer Std V7.1.1.445,功能真的很强超好用,推荐给有需要的朋友!
就写这么多了,希望能对像我一相熬夜的cser们提供一点帮助!

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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