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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值