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坑深, 慎入, 需深入.

猜你喜欢

转载自blog.csdn.net/ssxbxk/article/details/77852979