XE10 Android SOAP请求遭遇到Insufficient RTTI available to support this operation异常
1. 背景
XE10 Android 项目
a. 项目中会显示ArcGIS地图
b. 需要两个Timer(timer的间隔是个位数的秒), 定时刷新地图上的数据, 刷新的过程, 就是通过THTTPRIO与webservice进行SOAP通信.
此时, 程序在运行几分钟后, THTTPRIO 请求数据时出现下面的异常, 并且对界面进行操作时, 发现界面卡死:
Insufficient RTTI available to support this operation
2. 示例代码以及进一步说明
使用THTTPRIO 请求数据时的示例代码如下:
function CSoapWebSvrWrapperClass.GetAndroidUpdateUrl(iClientVer: Integer):String;
var
head: MySoapHeader;
szResp: String;
httpRIO : THTTPRIO;
begin
head := MySoapHeader.Create;
szResp := '';
try
head.Unarray := Self.C_UNARRY_HEADER;
httpRIO := Self.GetHttpRIO();
httpRIO.SOAPHeaders.Send(head);
szResp := GetMobileTerminalWSSoap(false, Utils.C_WEB_SVR_ADS + C_WEB_SVR_NAME,
httpRIO).GetApkUrl(iClientVer.ToString());
finally
FreeAndNil(head);
Release(httpRIO);
end;
result := szResp;
end;
调用上述GetAndroidUpdateUrl方法时, 并未在UI线程中调用(好像也无法在UI线程中调用)
并不是一直失败, 而是执行几分钟后失败, 也就是说, 一开始调用GetAndroidUpdateUrl是成功的, 过几分钟, 莫名其妙的就出现上述RTTI错误.
3. 解决方法
Delphi功力浅, 排查不到问题的原因, 所以采用了曲线救国的方法: Delphi中, 使用TIdHTTP代替THTTPRIO.
也就是把有问题的如下调用:
THTTPRIO ---------SOAP----->WebService(接口)
换成下面这样调用
TIdHTTP-------------HTTP------>WebService(aspx页面)------内部调用--->WebService(接口)
也就是在调用的过程中, 添加了一层WebService(aspx页面)
以C#的webservice为例:
a. 在webservice上, 新建一个.aspx文件;
b. aspx文件中不写任何html代码, 只是在Page_Load时, 根据URL的参数, 调用webservice上的接口
c. aspx使用Response.Write();方法, 将webservice接口的返回值返回.
4. 总结
虽然不知道RTTI是如何产生的, 但是, 目前看来, 这个问题没有出现了....Delphi坑深, 慎入, 需深入.