什么是“不是原生的消息转换器集”是什么意思?
问题描述:
我需要与某些Web服务交谈,因此我导入了WSDL。我现在试着去调用它,但它报告这个异常:No Native to Message converter set
非常,非常刺激,特别是因为我没有权限在这里发布这个服务的代码片段。不过,必须尝试......有没有人有关于如何解决这个错误的建议?什么是“不是原生的消息转换器集”是什么意思?
错误在函数TRIO.Generic中的rio.pas中生成。此行:
if not Assigned(FConverter) then
raise Exception.Create(SNoMessageConverter);
由于未知原因,FConverter设置为零,因此会生成异常。甚至在发送请求之前发生这种情况。什么都不会发送到服务,因为甚至在Delphi调用服务之前崩溃。
WSDL导入选项,勾选的选项:
- 一个Outparam是返回
- 开卷文字PARAMS
- 生成的析构函数
- 警告评论
- 地图串WideString的
- 生成详细信息吨类和接口
- 忽略的portType与HTTP绑定
- 不要发射未使用的类型
- 验证枚举类型
- 导入故障类型
- 导入头类型包括
- 过程与导入的模式
- 生成班级别名作为班级类型
- 处理可填写和可选元素
其实,我的系统是新的,大约3天前安装了Delphi,导入这个WSDL是我做的第一件事,基本上使用这些默认设置。
答
使用SoapUI消耗WSDL并制作模拟服务。将您的应用指向您的SoapUI模拟服务,并且您可以捕获您的出站请求。现在您可以转向并将这些请求提交给服务并查看响应。这应该让你知道消息来自何处。也就是说,它是否来自Delphi的SOAP库,是由于它不理解的内容或者它是否来自Web服务本身,这是由于您的请求中的某些IT不理解的结果?
或者,您可以在Delphi中执行此操作:通过利用HttpRIO对象的RIO_BeforeExecute/RIO_AfterExecute事件来拦截入站/出站XML。
如果您的流量是http(与SSL更难但可能),您也可以拦截Fiddler2。
一旦你有了原始的XML,用SoapUI提交请求,并看看你得到了什么。你可能会发现你的请求需要“调整”,或者如果在SoapUI中一切正常,你可能需要在反序列化之前调整响应。
请列出您的Delphi版本,以及您是否应用了任何修补程序,例如使用D2007 SOAP库修补D2005。还指出您使用的WSDL导入器的版本以及哪些选项。同时指出文件类型。为什么?这些通常是人们推荐你改变方式的第一件事。 – 2010-11-10 16:36:34
Chris,是不是delphi-2007的标签不够清楚? – 2010-11-11 08:29:23