Delphi SOAP应用触发ESOAPDomConvertError异常,求故障排查方案
首先明确说:这个错误和MD5令牌没有任何关系,它是Delphi SOAP框架中典型的类型兼容性问题。
错误原因拆解
错误提示里的TRIO.QueryInterface$1093$ActRec这个类,要么是你自定义的、要么是自动生成的,但它没有遵循Delphi SOAP的核心规则:所有需要通过SOAP传输的类必须继承自TRemotable。
SOAP在Delphi中依赖TRemotable来处理序列化、反序列化以及与WSDL定义的类型映射,普通的TObject派生类或者其他非SOAP基类无法被SOAP框架正确转换,于是就抛出了这个ESOAPDomConvertError异常。
解决步骤
排查自定义类/自动生成类的继承关系
检查你在SOAP接口函数中用到的参数、返回值对应的类,确保它们的基类是TRemotable。比如:
正确的SOAP兼容类定义:type TQueryActRec = class(TRemotable) private FID: Integer; FName: string; published property ID: Integer read FID write FID; property Name: string read FName write FName; end;如果你之前的类是直接继承
TObject,一定要改成继承TRemotable,并且用published段暴露需要序列化的属性(SOAP只会处理published的成员)。验证WSDL生成与Delphi类的映射
如果你是通过WSDL生成的客户端/服务端代码,有时候自动生成的类可能出现继承错误,需要手动检查生成的单元文件,确认所有复杂类型对应的类都继承自TRemotable。检查接口调用的参数传递
确认你在调用SOAP接口时,传入的参数类型是正确的SOAP兼容类,而不是不小心传入了普通对象或者其他不兼容的类型。比如不要把TStringList(普通类)直接传给需要TRemotable派生类的参数。
额外说明
MD5令牌相关的错误通常会表现为“签名无效”“权限验证失败”“令牌过期”这类提示,和类型转换完全是两个不同的问题方向,所以可以排除MD5令牌的影响。
内容的提问来源于stack exchange,提问作者Kim HJ

