2010-11-10 67 views
3

我需要与某些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是我做的第一件事,基本上使用这些默认设置。

+0

请列出您的Delphi版本,以及您是否应用了任何修补程序,例如使用D2007 SOAP库修补D2005。还指出您使用的WSDL导入器的版本以及哪些选项。同时指出文件类型。为什么?这些通常是人们推荐你改变方式的第一件事。 – 2010-11-10 16:36:34

+0

Chris,是不是delphi-2007的标签不够清楚? – 2010-11-11 08:29:23

回答

2

使用SoapUI消耗WSDL并制作模拟服务。将您的应用指向您的SoapUI模拟服务,并且您可以捕获您的出站请求。现在您可以转向并将这些请求提交给服务并查看响应。这应该让你知道消息来自何处。也就是说,它是否来自Delphi的SOAP库,是由于它不理解的内容或者它是否来自Web服务本身,这是由于您的请求中的某些IT不理解的结果?

或者,您可以在Delphi中执行此操作:通过利用HttpRIO对象的RIO_BeforeExecute/RIO_AfterExecute事件来拦截入站/出站XML。

如果您的流量是http(与SSL更难但可能),您也可以拦截Fiddler2。

一旦你有了原始的XML,用SoapUI提交请求,并看看你得到了什么。你可能会发现你的请求需要“调整”,或者如果在SoapUI中一切正常,你可能需要在反序列化之前调整响应。