如果某些Delphi SOAP RTL OpConvert.pas方法使用String而不是Stream作为其XML文档



我的代码中有一个警告,我不知道如何删除。该方法是一个调用THTTPRIO的FConverter字段的IOPConvert.ProcessResponse方法的实用方法。

IOPConvert中有几个ProcessResponse重载版本,其中以参数类型InvString作为第一个参数声明的版本是不推荐使用的版本。

在整个Delphi SOAP RTL中,从Delphi 7到现在(Delphi XE/XE2),趋势已经从字符串类型转向流类型。

问题是为什么?在这种情况下,我甚至不知道如何转换我的助手代码,除非我添加一个丑陋的字符串流包装器:

TRIOHelper = class helper for THTTPRIO
    public
        function HelperMethod(aMethName: String; aSoapString: String) : TRemotable;
    end;
function TRIOHelper.HelperMethod(aMethName, aSoapString: String): TRemotable;
var 
   tmpString:String;
begin 
     //FConverter is a field in THTTPRIO
     tmpStr := GrievousXmlHackery(aSoapString);
     FConverter.ProcessResponse(InvString(tmpStr), IntfMD, MethMD, FContext);
     ...
end;

不推荐使用的调用上面的代码正在调整XML文档(SOAP响应),并从传入流中删除一些有问题的元素。是的,一个黑客。我应该如何更改它,以及为什么OpConvert中的字符串不好?

我想我需要为tmpString制作一个字符串流或内存流包装器?请注意,在我的情况下,GrivousXmlHackery函数会在存在<encoding>标记时从SOAP中删除该标记,原因在这里仍然不重要。

除非旧方法和基于字符串的api在技术上确实出了问题,否则我会接受这个警告。但是,如果(像VCL中的许多地方一样),不推荐使用的警告也意味着"这里有龙",我想知道它。

我不熟悉Delphi的SOAP实现,但为什么不能直接使用TStringStream呢?

function TRIOHelper.HelperMethod(aMethName, aSoapString: String): TRemotable;
var 
  Strm: TStringStream;
begin 
     //FConverter is a field in THTTPRIO
     Strm := TStringStream.Create(GrievousXmlHackery(aSoapString));
     // or
     // Strm := TStringStream.Create('');
     // Strm.DataString := GreviousXmlHackery(aSoapString);
     FConverter.ProcessResponse(Strm, IntfMD, MethMD, FContext);
     // Not sure if you or THTTPRIO is responsible for releasing the stream
     ...
end;

相关内容

  • 没有找到相关文章

最新更新